Index: llvm/trunk/include/llvm/Support/COFF.h =================================================================== --- llvm/trunk/include/llvm/Support/COFF.h +++ llvm/trunk/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 @@ DEBUG_INDEX_SUBSECTION = 0xF4 }; + inline bool isReservedSectionNumber(int N) { + return N == IMAGE_SYM_UNDEFINED || N > MaxNumberOfSections; + } + } // End namespace COFF. } // End namespace llvm. Index: llvm/trunk/lib/Object/COFFObjectFile.cpp =================================================================== --- llvm/trunk/lib/Object/COFFObjectFile.cpp +++ llvm/trunk/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 @@ 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::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::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. Index: llvm/trunk/test/tools/llvm-readobj/file-headers.test =================================================================== --- llvm/trunk/test/tools/llvm-readobj/file-headers.test +++ llvm/trunk/test/tools/llvm-readobj/file-headers.test @@ -39,7 +39,7 @@ 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: ] Index: llvm/trunk/test/tools/llvm-readobj/symbols.test =================================================================== --- llvm/trunk/test/tools/llvm-readobj/symbols.test +++ llvm/trunk/test/tools/llvm-readobj/symbols.test @@ -5,6 +5,24 @@ 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) Index: llvm/trunk/tools/llvm-nm/llvm-nm.cpp =================================================================== --- llvm/trunk/tools/llvm-nm/llvm-nm.cpp +++ llvm/trunk/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 @@ 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 '?'; Index: llvm/trunk/tools/llvm-readobj/COFFDumper.cpp =================================================================== --- llvm/trunk/tools/llvm-readobj/COFFDumper.cpp +++ llvm/trunk/tools/llvm-readobj/COFFDumper.cpp @@ -985,7 +985,7 @@ } 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)))