diff options
author | Stephen Hines <srhines@google.com> | 2013-03-05 23:27:24 -0800 |
---|---|---|
committer | Stephen Hines <srhines@google.com> | 2013-03-05 23:27:24 -0800 |
commit | 5adb136be579e8fff3734461580cb34d1d2983b8 (patch) | |
tree | bff1a422e9c9789df563aaf9a7e91e63e8ec0384 /lib/MC/WinCOFFObjectWriter.cpp | |
parent | 227a4a4ade38716ba9eb3205f48b52910f3b955e (diff) | |
parent | b3201c5cf1e183d840f7c99ff779d57f1549d8e5 (diff) | |
download | external_llvm-5adb136be579e8fff3734461580cb34d1d2983b8.zip external_llvm-5adb136be579e8fff3734461580cb34d1d2983b8.tar.gz external_llvm-5adb136be579e8fff3734461580cb34d1d2983b8.tar.bz2 |
Merge commit 'b3201c5cf1e183d840f7c99ff779d57f1549d8e5' into merge_20130226
Conflicts:
include/llvm/Support/ELF.h
lib/Support/DeltaAlgorithm.cpp
Change-Id: I24a4fbce62eb39d924efee3c687b55e1e17b30cd
Diffstat (limited to 'lib/MC/WinCOFFObjectWriter.cpp')
-rw-r--r-- | lib/MC/WinCOFFObjectWriter.cpp | 53 |
1 files changed, 28 insertions, 25 deletions
diff --git a/lib/MC/WinCOFFObjectWriter.cpp b/lib/MC/WinCOFFObjectWriter.cpp index 01860c5..6dffed7 100644 --- a/lib/MC/WinCOFFObjectWriter.cpp +++ b/lib/MC/WinCOFFObjectWriter.cpp @@ -36,7 +36,7 @@ using namespace llvm; namespace { -typedef llvm::SmallString<COFF::NameSize> name; +typedef SmallString<COFF::NameSize> name; enum AuxiliaryType { ATFunctionDefinition, @@ -58,7 +58,7 @@ class COFFSymbol { public: COFF::symbol Data; - typedef llvm::SmallVector<AuxSymbol, 1> AuxiliarySymbols; + typedef SmallVector<AuxSymbol, 1> AuxiliarySymbols; name Name; int Index; @@ -69,7 +69,7 @@ public: MCSymbolData const *MCData; - COFFSymbol(llvm::StringRef name); + COFFSymbol(StringRef name); size_t size() const; void set_name_offset(uint32_t Offset); @@ -97,13 +97,13 @@ public: COFFSymbol *Symbol; relocations Relocations; - COFFSection(llvm::StringRef name); + COFFSection(StringRef name); static size_t size(); }; // This class holds the COFF string table. class StringTable { - typedef llvm::StringMap<size_t> map; + typedef StringMap<size_t> map; map Map; void update_length(); @@ -112,7 +112,7 @@ public: StringTable(); size_t size() const; - size_t insert(llvm::StringRef String); + size_t insert(StringRef String); }; class WinCOFFObjectWriter : public MCObjectWriter { @@ -144,10 +144,12 @@ public: COFFSection *createSection(StringRef Name); template <typename object_t, typename list_t> - object_t *createCOFFEntity(llvm::StringRef Name, list_t &List); + object_t *createCOFFEntity(StringRef Name, list_t &List); void DefineSection(MCSectionData const &SectionData); - void DefineSymbol(MCSymbolData const &SymbolData, MCAssembler &Assembler); + void DefineSymbol(MCSymbol const &Symbol, + MCSymbolData const &SymbolData, + MCAssembler &Assembler); void MakeSymbolReal(COFFSymbol &S, size_t Index); void MakeSectionReal(COFFSection &S, size_t Number); @@ -202,7 +204,7 @@ static inline void write_uint8_le(void *Data, uint8_t const &Value) { //------------------------------------------------------------------------------ // Symbol class implementation -COFFSymbol::COFFSymbol(llvm::StringRef name) +COFFSymbol::COFFSymbol(StringRef name) : Name(name.begin(), name.end()) , Other(NULL) , Section(NULL) @@ -254,7 +256,7 @@ bool COFFSymbol::should_keep() const { //------------------------------------------------------------------------------ // Section class implementation -COFFSection::COFFSection(llvm::StringRef name) +COFFSection::COFFSection(StringRef name) : Name(name) , MCData(NULL) , Symbol(NULL) { @@ -287,7 +289,7 @@ size_t StringTable::size() const { /// Add String to the table iff it is not already there. /// @returns the index into the string table where the string is now located. -size_t StringTable::insert(llvm::StringRef String) { +size_t StringTable::insert(StringRef String) { map::iterator i = Map.find(String); if (i != Map.end()) @@ -341,14 +343,14 @@ COFFSymbol *WinCOFFObjectWriter::GetOrCreateCOFFSymbol(const MCSymbol * Symbol){ return RetSymbol; } -COFFSection *WinCOFFObjectWriter::createSection(llvm::StringRef Name) { +COFFSection *WinCOFFObjectWriter::createSection(StringRef Name) { return createCOFFEntity<COFFSection>(Name, Sections); } /// A template used to lookup or create a symbol/section, and initialize it if /// needed. template <typename object_t, typename list_t> -object_t *WinCOFFObjectWriter::createCOFFEntity(llvm::StringRef Name, +object_t *WinCOFFObjectWriter::createCOFFEntity(StringRef Name, list_t &List) { object_t *Object = new object_t(Name); @@ -408,9 +410,10 @@ void WinCOFFObjectWriter::DefineSection(MCSectionData const &SectionData) { /// This function takes a section data object from the assembler /// and creates the associated COFF symbol staging object. -void WinCOFFObjectWriter::DefineSymbol(MCSymbolData const &SymbolData, +void WinCOFFObjectWriter::DefineSymbol(MCSymbol const &Symbol, + MCSymbolData const &SymbolData, MCAssembler &Assembler) { - COFFSymbol *coff_symbol = GetOrCreateCOFFSymbol(&SymbolData.getSymbol()); + COFFSymbol *coff_symbol = GetOrCreateCOFFSymbol(&Symbol); coff_symbol->Data.Type = (SymbolData.getFlags() & 0x0000FFFF) >> 0; coff_symbol->Data.StorageClass = (SymbolData.getFlags() & 0x00FF0000) >> 16; @@ -418,20 +421,17 @@ void WinCOFFObjectWriter::DefineSymbol(MCSymbolData const &SymbolData, if (SymbolData.getFlags() & COFF::SF_WeakExternal) { coff_symbol->Data.StorageClass = COFF::IMAGE_SYM_CLASS_WEAK_EXTERNAL; - if (SymbolData.getSymbol().isVariable()) { + if (Symbol.isVariable()) { coff_symbol->Data.StorageClass = COFF::IMAGE_SYM_CLASS_WEAK_EXTERNAL; - const MCExpr *Value = SymbolData.getSymbol().getVariableValue(); // FIXME: This assert message isn't very good. - assert(Value->getKind() == MCExpr::SymbolRef && + assert(Symbol.getVariableValue()->getKind() == MCExpr::SymbolRef && "Value must be a SymbolRef!"); - const MCSymbolRefExpr *SymbolRef = - static_cast<const MCSymbolRefExpr *>(Value); - coff_symbol->Other = GetOrCreateCOFFSymbol(&SymbolRef->getSymbol()); + coff_symbol->Other = GetOrCreateCOFFSymbol(&Symbol); } else { std::string WeakName = std::string(".weak.") - + SymbolData.getSymbol().getName().str() + + Symbol.getName().str() + ".default"; COFFSymbol *WeakDefault = createSymbol(WeakName); WeakDefault->Data.SectionNumber = COFF::IMAGE_SYM_ABSOLUTE; @@ -464,7 +464,7 @@ void WinCOFFObjectWriter::DefineSymbol(MCSymbolData const &SymbolData, // Bind internal COFF symbol to MC symbol. coff_symbol->MCData = &SymbolData; - SymbolMap[&SymbolData.getSymbol()] = coff_symbol; + SymbolMap[&Symbol] = coff_symbol; } /// making a section real involves assigned it a number and putting @@ -619,8 +619,11 @@ void WinCOFFObjectWriter::ExecutePostLayoutBinding(MCAssembler &Asm, for (MCAssembler::const_symbol_iterator i = Asm.symbol_begin(), e = Asm.symbol_end(); i != e; i++) { - if (ExportSymbol(*i, Asm)) - DefineSymbol(*i, Asm); + if (ExportSymbol(*i, Asm)) { + const MCSymbol &Alias = i->getSymbol(); + const MCSymbol &Symbol = Alias.AliasedSymbol(); + DefineSymbol(Alias, Asm.getSymbolData(Symbol), Asm); + } } } |