mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-08 13:00:50 +00:00
PIC16: Plug a leak in PIC16Section by allocating name & address strings in the
MCContext. There is still one leak left in PIC16Section (the Items vector). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@99887 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
fb70e7deaf
commit
91b1d8fdbf
@ -17,10 +17,9 @@ using namespace llvm;
|
||||
|
||||
// This is the only way to create a PIC16Section. Sections created here
|
||||
// do not need to be explicitly deleted as they are managed by auto_ptrs.
|
||||
PIC16Section *PIC16Section::Create(const StringRef &Name,
|
||||
PIC16SectionType Ty,
|
||||
const std::string &Address,
|
||||
int Color, MCContext &Ctx) {
|
||||
PIC16Section *PIC16Section::Create(StringRef Name, PIC16SectionType Ty,
|
||||
StringRef Address, int Color,
|
||||
MCContext &Ctx) {
|
||||
|
||||
/// Determine the internal SectionKind info.
|
||||
/// Users of PIC16Section class should not need to know the internal
|
||||
@ -59,8 +58,17 @@ PIC16Section *PIC16Section::Create(const StringRef &Name,
|
||||
|
||||
}
|
||||
|
||||
// Copy strings into context allocated memory so they get free'd when the
|
||||
// context is destroyed.
|
||||
char *NameCopy = static_cast<char*>(Ctx.Allocate(Name.size(), 1));
|
||||
memcpy(NameCopy, Name.data(), Name.size());
|
||||
char *AddressCopy = static_cast<char*>(Ctx.Allocate(Address.size(), 1));
|
||||
memcpy(AddressCopy, Address.data(), Address.size());
|
||||
|
||||
// Create the Section.
|
||||
PIC16Section *S = new (Ctx) PIC16Section(Name, K, Address, Color);
|
||||
PIC16Section *S =
|
||||
new (Ctx) PIC16Section(StringRef(NameCopy, Name.size()), K,
|
||||
StringRef(AddressCopy, Address.size()), Color);
|
||||
S->T = Ty;
|
||||
return S;
|
||||
}
|
||||
|
@ -30,11 +30,11 @@ namespace llvm {
|
||||
PIC16SectionType T;
|
||||
|
||||
/// Name of the section to uniquely identify it.
|
||||
std::string Name;
|
||||
StringRef Name;
|
||||
|
||||
/// User can specify an address at which a section should be placed.
|
||||
/// Negative value here means user hasn't specified any.
|
||||
std::string Address;
|
||||
StringRef Address;
|
||||
|
||||
/// Overlay information - Sections with same color can be overlaid on
|
||||
/// one another.
|
||||
@ -43,17 +43,16 @@ namespace llvm {
|
||||
/// Total size of all data objects contained here.
|
||||
unsigned Size;
|
||||
|
||||
PIC16Section(const StringRef &name, SectionKind K, const std::string &addr,
|
||||
int color)
|
||||
PIC16Section(StringRef name, SectionKind K, StringRef addr, int color)
|
||||
: MCSection(K), Name(name), Address(addr), Color(color), Size(0) {
|
||||
}
|
||||
|
||||
public:
|
||||
/// Return the name of the section.
|
||||
const std::string &getName() const { return Name; }
|
||||
StringRef getName() const { return Name; }
|
||||
|
||||
/// Return the Address of the section.
|
||||
const std::string &getAddress() const { return Address; }
|
||||
StringRef getAddress() const { return Address; }
|
||||
|
||||
/// Return the Color of the section.
|
||||
int getColor() const { return Color; }
|
||||
@ -77,8 +76,8 @@ namespace llvm {
|
||||
PIC16SectionType getType() const { return T; }
|
||||
|
||||
/// This would be the only way to create a section.
|
||||
static PIC16Section *Create(const StringRef &Name, PIC16SectionType Ty,
|
||||
const std::string &Address, int Color,
|
||||
static PIC16Section *Create(StringRef Name, PIC16SectionType Ty,
|
||||
StringRef Address, int Color,
|
||||
MCContext &Ctx);
|
||||
|
||||
/// Override this as PIC16 has its own way of printing switching
|
||||
|
Loading…
Reference in New Issue
Block a user