diff options
author | David Blaikie <dblaikie@gmail.com> | 2014-04-15 05:25:03 +0000 |
---|---|---|
committer | David Blaikie <dblaikie@gmail.com> | 2014-04-15 05:25:03 +0000 |
commit | f564ab62677c17775603465dbd7c1668d27bae20 (patch) | |
tree | 1900570f89ee0a8dee11337d06d057988c978084 /llvm/lib | |
parent | bb97e1b52ef5315fedf0b92101bcf95e2fae8ff3 (diff) | |
download | bcm5719-llvm-f564ab62677c17775603465dbd7c1668d27bae20.tar.gz bcm5719-llvm-f564ab62677c17775603465dbd7c1668d27bae20.zip |
Use unique_ptr for section/segment ownership in WinCOFFObjectWriter
llvm-svn: 206245
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/MC/WinCOFFObjectWriter.cpp | 73 |
1 files changed, 32 insertions, 41 deletions
diff --git a/llvm/lib/MC/WinCOFFObjectWriter.cpp b/llvm/lib/MC/WinCOFFObjectWriter.cpp index 335986dac53..208dc476bdd 100644 --- a/llvm/lib/MC/WinCOFFObjectWriter.cpp +++ b/llvm/lib/MC/WinCOFFObjectWriter.cpp @@ -17,6 +17,7 @@ #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringRef.h" +#include "llvm/ADT/STLExtras.h" #include "llvm/ADT/Twine.h" #include "llvm/MC/MCAsmLayout.h" #include "llvm/MC/MCAssembler.h" @@ -118,8 +119,8 @@ public: class WinCOFFObjectWriter : public MCObjectWriter { public: - typedef std::vector<COFFSymbol*> symbols; - typedef std::vector<COFFSection*> sections; + typedef std::vector<std::unique_ptr<COFFSymbol>> symbols; + typedef std::vector<std::unique_ptr<COFFSection>> sections; typedef DenseMap<MCSymbol const *, COFFSymbol *> symbol_map; typedef DenseMap<MCSection const *, COFFSection *> section_map; @@ -137,7 +138,6 @@ public: symbol_map SymbolMap; WinCOFFObjectWriter(MCWinCOFFObjectTargetWriter *MOTW, raw_ostream &OS); - virtual ~WinCOFFObjectWriter(); COFFSymbol *createSymbol(StringRef Name); COFFSymbol *GetOrCreateCOFFSymbol(const MCSymbol * Symbol); @@ -160,7 +160,7 @@ public: // Entity writing methods. void WriteFileHeader(const COFF::header &Header); - void WriteSymbol(const COFFSymbol *S); + void WriteSymbol(const COFFSymbol &S); void WriteAuxiliarySymbols(const COFFSymbol::AuxiliarySymbols &S); void WriteSectionHeader(const COFF::section &S); void WriteRelocation(const COFF::relocation &R); @@ -308,13 +308,6 @@ WinCOFFObjectWriter::WinCOFFObjectWriter(MCWinCOFFObjectTargetWriter *MOTW, Header.Machine = TargetObjectWriter->getMachine(); } -WinCOFFObjectWriter::~WinCOFFObjectWriter() { - for (symbols::iterator I = Symbols.begin(), E = Symbols.end(); I != E; ++I) - delete *I; - for (sections::iterator I = Sections.begin(), E = Sections.end(); I != E; ++I) - delete *I; -} - COFFSymbol *WinCOFFObjectWriter::createSymbol(StringRef Name) { return createCOFFEntity<COFFSymbol>(Name, Symbols); } @@ -338,11 +331,9 @@ COFFSection *WinCOFFObjectWriter::createSection(StringRef Name) { template <typename object_t, typename list_t> object_t *WinCOFFObjectWriter::createCOFFEntity(StringRef Name, list_t &List) { - object_t *Object = new object_t(Name); - - List.push_back(Object); + List.push_back(make_unique<object_t>(Name)); - return Object; + return List.back().get(); } /// This function takes a section data object from the assembler @@ -563,14 +554,14 @@ void WinCOFFObjectWriter::WriteFileHeader(const COFF::header &Header) { WriteLE16(Header.Characteristics); } -void WinCOFFObjectWriter::WriteSymbol(const COFFSymbol *S) { - WriteBytes(StringRef(S->Data.Name, COFF::NameSize)); - WriteLE32(S->Data.Value); - WriteLE16(S->Data.SectionNumber); - WriteLE16(S->Data.Type); - Write8(S->Data.StorageClass); - Write8(S->Data.NumberOfAuxSymbols); - WriteAuxiliarySymbols(S->Aux); +void WinCOFFObjectWriter::WriteSymbol(const COFFSymbol &S) { + WriteBytes(StringRef(S.Data.Name, COFF::NameSize)); + WriteLE32(S.Data.Value); + WriteLE16(S.Data.SectionNumber); + WriteLE16(S.Data.Type); + Write8(S.Data.StorageClass); + Write8(S.Data.NumberOfAuxSymbols); + WriteAuxiliarySymbols(S.Aux); } void WinCOFFObjectWriter::WriteAuxiliarySymbols( @@ -758,7 +749,7 @@ void WinCOFFObjectWriter::WriteObject(MCAssembler &Asm, e = Sections.end(); i != e; i++) { if (Layout.getSectionAddressSize((*i)->MCData) > 0) { size_t Number = ++Header.NumberOfSections; - SectionIndices[*i] = Number; + SectionIndices[i->get()] = Number; MakeSectionReal(**i, Number); } else { (*i)->Number = -1; @@ -768,38 +759,38 @@ void WinCOFFObjectWriter::WriteObject(MCAssembler &Asm, Header.NumberOfSymbols = 0; for (symbols::iterator i = Symbols.begin(), e = Symbols.end(); i != e; i++) { - COFFSymbol *coff_symbol = *i; - MCSymbolData const *SymbolData = coff_symbol->MCData; + COFFSymbol &coff_symbol = **i; + MCSymbolData const *SymbolData = coff_symbol.MCData; // Update section number & offset for symbols that have them. if (SymbolData && SymbolData->Fragment) { - assert(coff_symbol->Section != nullptr); + assert(coff_symbol.Section != nullptr); - coff_symbol->Data.SectionNumber = coff_symbol->Section->Number; - coff_symbol->Data.Value = Layout.getFragmentOffset(SymbolData->Fragment) + coff_symbol.Data.SectionNumber = coff_symbol.Section->Number; + coff_symbol.Data.Value = Layout.getFragmentOffset(SymbolData->Fragment) + SymbolData->Offset; } - if (coff_symbol->should_keep()) { - MakeSymbolReal(*coff_symbol, Header.NumberOfSymbols++); + if (coff_symbol.should_keep()) { + MakeSymbolReal(coff_symbol, Header.NumberOfSymbols++); // Update auxiliary symbol info. - coff_symbol->Data.NumberOfAuxSymbols = coff_symbol->Aux.size(); - Header.NumberOfSymbols += coff_symbol->Data.NumberOfAuxSymbols; + coff_symbol.Data.NumberOfAuxSymbols = coff_symbol.Aux.size(); + Header.NumberOfSymbols += coff_symbol.Data.NumberOfAuxSymbols; } else - coff_symbol->Index = -1; + coff_symbol.Index = -1; } // Fixup weak external references. for (symbols::iterator i = Symbols.begin(), e = Symbols.end(); i != e; i++) { - COFFSymbol *coff_symbol = *i; - if (coff_symbol->Other) { - assert(coff_symbol->Index != -1); - assert(coff_symbol->Aux.size() == 1 && + COFFSymbol &coff_symbol = **i; + if (coff_symbol.Other) { + assert(coff_symbol.Index != -1); + assert(coff_symbol.Aux.size() == 1 && "Symbol must contain one aux symbol!"); - assert(coff_symbol->Aux[0].AuxType == ATWeakExternal && + assert(coff_symbol.Aux[0].AuxType == ATWeakExternal && "Symbol's aux symbol must be a Weak External!"); - coff_symbol->Aux[0].Aux.WeakExternal.TagIndex = coff_symbol->Other->Index; + coff_symbol.Aux[0].Aux.WeakExternal.TagIndex = coff_symbol.Other->Index; } } @@ -954,7 +945,7 @@ void WinCOFFObjectWriter::WriteObject(MCAssembler &Asm, for (symbols::iterator i = Symbols.begin(), e = Symbols.end(); i != e; i++) if ((*i)->Index != -1) - WriteSymbol(*i); + WriteSymbol(**i); OS.write((char const *)&Strings.Data.front(), Strings.Data.size()); } |