summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2014-03-18 23:37:53 +0000
committerRui Ueyama <ruiu@google.com>2014-03-18 23:37:53 +0000
commitcae25dcbf7347d1a04f8746aedd6d6600b528a40 (patch)
tree88bd9114a82d47fa0d113343e395db8ec212e90e
parent2c4507e850d353433a525fb763df05dd8a407173 (diff)
Object/COFF: Add function to check if section number is reserved one.
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
-rw-r--r--include/llvm/Support/COFF.h7
-rw-r--r--lib/Object/COFFObjectFile.cpp11
-rw-r--r--test/tools/llvm-readobj/Inputs/trivial.obj.coff-i386bin314 -> 350 bytes
-rw-r--r--test/tools/llvm-readobj/file-headers.test2
-rw-r--r--test/tools/llvm-readobj/symbols.test18
-rw-r--r--tools/llvm-nm/llvm-nm.cpp5
-rw-r--r--tools/llvm-readobj/COFFDumper.cpp2
7 files changed, 34 insertions, 11 deletions
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 <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.
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
--- a/test/tools/llvm-readobj/Inputs/trivial.obj.coff-i386
+++ b/test/tools/llvm-readobj/Inputs/trivial.obj.coff-i386
Binary files 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)))