diff --git a/include/llvm/Support/COFF.h b/include/llvm/Support/COFF.h index c408e828106..55862533091 100644 --- a/include/llvm/Support/COFF.h +++ b/include/llvm/Support/COFF.h @@ -30,6 +30,9 @@ namespace llvm { namespace COFF { + // The maximum number of sections that a COFF object can have (inclusive). + const int MaxNumberOfSections = 65299; + // The PE signature bytes that follows the DOS stub header. static const char PEMagic[] = { 'P', 'E', '\0', '\0' }; @@ -625,6 +628,10 @@ namespace COFF { DEBUG_INDEX_SUBSECTION = 0xF4 }; + inline bool isReservedSectionNumber(int N) { + return N == IMAGE_SYM_UNDEFINED || N > MaxNumberOfSections; + } + } // End namespace COFF. } // End namespace llvm. diff --git a/lib/Object/COFFObjectFile.cpp b/lib/Object/COFFObjectFile.cpp index 7f66c6a29c8..039bc4ef48b 100644 --- a/lib/Object/COFFObjectFile.cpp +++ b/lib/Object/COFFObjectFile.cpp @@ -16,6 +16,7 @@ #include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/ADT/Triple.h" +#include "llvm/Support/COFF.h" #include "llvm/Support/Debug.h" #include "llvm/Support/raw_ostream.h" #include @@ -177,7 +178,7 @@ error_code COFFObjectFile::getSymbolType(DataRefImpl Ref, Result = SymbolRef::ST_Function; } else { uint32_t Characteristics = 0; - if (Symb->SectionNumber > 0) { + if (!COFF::isReservedSectionNumber(Symb->SectionNumber)) { const coff_section *Section = NULL; if (error_code EC = getSection(Symb->SectionNumber, Section)) return EC; @@ -239,9 +240,9 @@ error_code COFFObjectFile::getSymbolSize(DataRefImpl Ref, error_code COFFObjectFile::getSymbolSection(DataRefImpl Ref, section_iterator &Result) const { const coff_symbol *Symb = toSymb(Ref); - if (Symb->SectionNumber <= COFF::IMAGE_SYM_UNDEFINED) + if (COFF::isReservedSectionNumber(Symb->SectionNumber)) { Result = section_end(); - else { + } else { const coff_section *Sec = 0; if (error_code EC = getSection(Symb->SectionNumber, Sec)) return EC; DataRefImpl Ref; @@ -721,9 +722,7 @@ error_code COFFObjectFile::getDataDirectory(uint32_t Index, error_code COFFObjectFile::getSection(int32_t Index, const coff_section *&Result) const { // Check for special index values. - if (Index == COFF::IMAGE_SYM_UNDEFINED || - Index == COFF::IMAGE_SYM_ABSOLUTE || - Index == COFF::IMAGE_SYM_DEBUG) + if (COFF::isReservedSectionNumber(Index)) Result = NULL; else if (Index > 0 && Index <= COFFHeader->NumberOfSections) // We already verified the section table data, so no need to check again. diff --git a/test/tools/llvm-readobj/Inputs/trivial.obj.coff-i386 b/test/tools/llvm-readobj/Inputs/trivial.obj.coff-i386 index 282e5699a76..7486562c978 100644 Binary files a/test/tools/llvm-readobj/Inputs/trivial.obj.coff-i386 and b/test/tools/llvm-readobj/Inputs/trivial.obj.coff-i386 differ diff --git a/test/tools/llvm-readobj/file-headers.test b/test/tools/llvm-readobj/file-headers.test index 845bad87930..39a8c0ef899 100644 --- a/test/tools/llvm-readobj/file-headers.test +++ b/test/tools/llvm-readobj/file-headers.test @@ -39,7 +39,7 @@ COFF32-NEXT: Machine: IMAGE_FILE_MACHINE_I386 (0x14C) COFF32-NEXT: SectionCount: 2 COFF32-NEXT: TimeDateStamp: 2013-03-20 17:56:46 (0x5149F85E) COFF32-NEXT: PointerToSymbolTable: 0xA5 -COFF32-NEXT: SymbolCount: 7 +COFF32-NEXT: SymbolCount: 9 COFF32-NEXT: OptionalHeaderSize: 0 COFF32-NEXT: Characteristics [ (0x0) COFF32-NEXT: ] diff --git a/test/tools/llvm-readobj/symbols.test b/test/tools/llvm-readobj/symbols.test index e014377e586..e427bdc8d97 100644 --- a/test/tools/llvm-readobj/symbols.test +++ b/test/tools/llvm-readobj/symbols.test @@ -5,6 +5,24 @@ RUN: | FileCheck %s -check-prefix ELF COFF: Symbols [ COFF-NEXT: Symbol { +COFF-NEXT: Name: @comp.id +COFF-NEXT: Value: 14766605 +COFF-NEXT: Section: (65535) +COFF-NEXT: BaseType: Null (0x0) +COFF-NEXT: ComplexType: Null (0x0) +COFF-NEXT: StorageClass: Static (0x3) +COFF-NEXT: AuxSymbolCount: 0 +COFF-NEXT: } +COFF-NEXT: Symbol { +COFF-NEXT: Name: @feat.00 +COFF-NEXT: Value: 2147484049 +COFF-NEXT: Section: (65535) +COFF-NEXT: BaseType: Null (0x0) +COFF-NEXT: ComplexType: Null (0x0) +COFF-NEXT: StorageClass: Static (0x3) +COFF-NEXT: AuxSymbolCount: 0 +COFF-NEXT: } +COFF-NEXT: Symbol { COFF-NEXT: Name: .text COFF-NEXT: Value: 0 COFF-NEXT: Section: .text (1) diff --git a/tools/llvm-nm/llvm-nm.cpp b/tools/llvm-nm/llvm-nm.cpp index a1ef74efeb5..100a1f20a11 100644 --- a/tools/llvm-nm/llvm-nm.cpp +++ b/tools/llvm-nm/llvm-nm.cpp @@ -27,6 +27,7 @@ #include "llvm/Object/MachO.h" #include "llvm/Object/MachOUniversal.h" #include "llvm/Object/ObjectFile.h" +#include "llvm/Support/COFF.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Format.h" @@ -317,9 +318,7 @@ static char getSymbolNMTypeChar(COFFObjectFile &Obj, symbol_iterator I) { return Ret; uint32_t Characteristics = 0; - if (Symb->SectionNumber > 0 && - Symb->SectionNumber != llvm::COFF::IMAGE_SYM_DEBUG && - Symb->SectionNumber != llvm::COFF::IMAGE_SYM_ABSOLUTE) { + if (!COFF::isReservedSectionNumber(Symb->SectionNumber)) { section_iterator SecI = Obj.section_end(); if (error(SymI->getSection(SecI))) return '?'; diff --git a/tools/llvm-readobj/COFFDumper.cpp b/tools/llvm-readobj/COFFDumper.cpp index e790e5ca0c4..f17524eccb2 100644 --- a/tools/llvm-readobj/COFFDumper.cpp +++ b/tools/llvm-readobj/COFFDumper.cpp @@ -985,7 +985,7 @@ void COFFDumper::printSymbol(const SymbolRef &Sym) { } else if ( Symbol->StorageClass == COFF::IMAGE_SYM_CLASS_WEAK_EXTERNAL || (Symbol->StorageClass == COFF::IMAGE_SYM_CLASS_EXTERNAL && - Symbol->SectionNumber == 0 && + Symbol->SectionNumber == COFF::IMAGE_SYM_UNDEFINED && Symbol->Value == 0)) { const coff_aux_weak_external_definition *Aux; if (error(getSymbolAuxData(Obj, Symbol + I, Aux)))