From e7c352fd3e8d17065e0557e6dc63f9e21168e527 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Thu, 9 Jul 2015 17:43:50 +0000 Subject: COFF: Fill in the type and storage class in the symbol table We can use the type and storage class from the symbol's original object file to fill in the linked executable's symbol table. git-svn-id: https://llvm.org/svn/llvm-project/lld/trunk@241828 91177308-0d34-0410-b5e6-96231b3b80d8 --- COFF/Symbols.cpp | 8 ++++++++ COFF/Symbols.h | 4 ++++ COFF/Writer.cpp | 4 +++- test/COFF/symtab.test | 8 ++++---- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/COFF/Symbols.cpp b/COFF/Symbols.cpp index b3975a59c..402dd439c 100644 --- a/COFF/Symbols.cpp +++ b/COFF/Symbols.cpp @@ -209,6 +209,14 @@ uint64_t Defined::getFileOff() { llvm_unreachable("unknown symbol kind"); } +COFFSymbolRef DefinedCOFF::getCOFFSymbol() { + size_t SymSize = File->getCOFFObj()->getSymbolTableEntrySize(); + if (SymSize == sizeof(coff_symbol16)) + return COFFSymbolRef(reinterpret_cast(Sym)); + assert(SymSize == sizeof(coff_symbol32)); + return COFFSymbolRef(reinterpret_cast(Sym)); +} + ErrorOr> Lazy::getMember() { auto MBRefOrErr = File->getMember(&Sym); if (auto EC = MBRefOrErr.getError()) diff --git a/COFF/Symbols.h b/COFF/Symbols.h index 88b0e69ae..5c8e55f01 100644 --- a/COFF/Symbols.h +++ b/COFF/Symbols.h @@ -27,6 +27,8 @@ using llvm::object::Archive; using llvm::object::COFFSymbolRef; using llvm::object::coff_import_header; using llvm::object::coff_symbol_generic; +using llvm::object::coff_symbol16; +using llvm::object::coff_symbol32; class ArchiveFile; class BitcodeFile; @@ -142,6 +144,8 @@ public: int getFileIndex() { return File->Index; } + COFFSymbolRef getCOFFSymbol(); + protected: ObjectFile *File; const coff_symbol_generic *Sym; diff --git a/COFF/Writer.cpp b/COFF/Writer.cpp index 60e901a76..23ce84855 100644 --- a/COFF/Writer.cpp +++ b/COFF/Writer.cpp @@ -327,9 +327,11 @@ void Writer::createSymbolAndStringTable() { memcpy(Sym.Name.ShortName, Name.data(), Name.size()); } + COFFSymbolRef DSymRef= D->getCOFFSymbol(); Sym.Value = SymbolValue; Sym.SectionNumber = SymSec->SectionIndex; - Sym.StorageClass = IMAGE_SYM_CLASS_NULL; + Sym.Type = DSymRef.getType(); + Sym.StorageClass = DSymRef.getStorageClass(); Sym.NumberOfAuxSymbols = 0; OutputSymtab.push_back(Sym); } diff --git a/test/COFF/symtab.test b/test/COFF/symtab.test index 4e865b01b..6e499320a 100644 --- a/test/COFF/symtab.test +++ b/test/COFF/symtab.test @@ -9,7 +9,7 @@ # CHECK-NEXT: Section: .text # CHECK-NEXT: BaseType: Null (0x0) # CHECK-NEXT: ComplexType: Null (0x0) -# CHECK-NEXT: StorageClass: Null (0x0) +# CHECK-NEXT: StorageClass: Static # CHECK-NEXT: AuxSymbolCount: 0 # CHECK-NEXT: } # CHECK-NEXT: Symbol { @@ -18,7 +18,7 @@ # CHECK-NEXT: Section: .text # CHECK-NEXT: BaseType: Null (0x0) # CHECK-NEXT: ComplexType: Null (0x0) -# CHECK-NEXT: StorageClass: Null (0x0) +# CHECK-NEXT: StorageClass: External # CHECK-NEXT: AuxSymbolCount: 0 # CHECK-NEXT: } # CHECK-NEXT: Symbol { @@ -27,7 +27,7 @@ # CHECK-NEXT: Section: .text # CHECK-NEXT: BaseType: Null (0x0) # CHECK-NEXT: ComplexType: Null (0x0) -# CHECK-NEXT: StorageClass: Null (0x0) +# CHECK-NEXT: StorageClass: External # CHECK-NEXT: AuxSymbolCount: 0 # CHECK-NEXT: } # CHECK-NEXT: Symbol { @@ -36,7 +36,7 @@ # CHECK-NEXT: Section: .text # CHECK-NEXT: BaseType: Null (0x0) # CHECK-NEXT: ComplexType: Null (0x0) -# CHECK-NEXT: StorageClass: Null (0x0) +# CHECK-NEXT: StorageClass: External # CHECK-NEXT: AuxSymbolCount: 0 # CHECK-NEXT: } # CHECK-NEXT: ] -- cgit v1.2.3