Object/COFF: Add function to check if section number is reserved one.
authorRui Ueyama <ruiu@google.com>
Tue, 18 Mar 2014 23:37:53 +0000 (23:37 +0000)
committerRui Ueyama <ruiu@google.com>
Tue, 18 Mar 2014 23:37:53 +0000 (23:37 +0000)
Differential Revision: http://llvm-reviews.chandlerc.com/D3103

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@204199 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/COFF.h
lib/Object/COFFObjectFile.cpp
test/tools/llvm-readobj/Inputs/trivial.obj.coff-i386
test/tools/llvm-readobj/file-headers.test
test/tools/llvm-readobj/symbols.test
tools/llvm-nm/llvm-nm.cpp
tools/llvm-readobj/COFFDumper.cpp

index c408e828106e76dece8c2c46ecfd4bff6df78087..558625330911fda911ebeeabdcaed153e0a960d9 100644 (file)
@@ -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.
 
index 7f66c6a29c8df168cb35bf9fb76961a8efff2f56..039bc4ef48b97951355eb349e7f5644780e58c5a 100644 (file)
@@ -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 <cctype>
@@ -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.
index 282e5699a767d8bc132e5e415161ae71445ffb87..7486562c978786669734d36957172eb6e67c3738 100644 (file)
Binary files a/test/tools/llvm-readobj/Inputs/trivial.obj.coff-i386 and b/test/tools/llvm-readobj/Inputs/trivial.obj.coff-i386 differ
index 845bad87930644a5bda04bbcf2e5172ad6ee1f2f..39a8c0ef89917345ce64289fe1d4432a3b6e63e2 100644 (file)
@@ -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:   ]
index e014377e586f484d69ca0f9291615b7fbcc706f2..e427bdc8d97836fb18a7c0a04ea64acab23e4a21 100644 (file)
@@ -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)
index a1ef74efeb55124e36eae1f5b3a012bd18ae4b7a..100a1f20a118ddb7965a482cff4b101f7bd22845 100644 (file)
@@ -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 '?';
index e790e5ca0c442b1f32b96b3ebd7dfa46845a0955..f17524eccb2ee852c66b1491203e1646adf69ebc 100644 (file)
@@ -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)))