Object/COFF: change data type of SymbolNumber from int16 to uint16.

Microsoft PE/COFF Spec clearly states that the field is of signed interger
type. However, in reality, it's unsigned. If cl.exe needs to create a large
number of sections for COMDAT sections, it will just create more than 32768
sections. Handling large section number as negative number is not correct.
I think this is a spec bug.

Differential Revision: http://llvm-reviews.chandlerc.com/D3088

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@203986 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rui Ueyama 2014-03-15 00:04:08 +00:00
parent 1d8c02bef3
commit 7aa478d944
5 changed files with 8 additions and 6 deletions

View File

@ -193,7 +193,7 @@ struct coff_symbol {
} Name;
support::ulittle32_t Value;
support::little16_t SectionNumber;
support::ulittle16_t SectionNumber;
support::ulittle16_t Type;

View File

@ -138,8 +138,8 @@ namespace COFF {
};
enum SymbolSectionNumber {
IMAGE_SYM_DEBUG = -2,
IMAGE_SYM_ABSOLUTE = -1,
IMAGE_SYM_DEBUG = 0xFFFE,
IMAGE_SYM_ABSOLUTE = 0xFFFF,
IMAGE_SYM_UNDEFINED = 0
};

View File

@ -6,7 +6,7 @@
// CHECK: Symbol {
// CHECK: Name: @feat.00
// CHECK: Value: 123
// CHECK: Section: (-1)
// CHECK: Section: (65535)
// CHECK: BaseType: Null (0x0)
// CHECK: ComplexType: Null (0x0)
// CHECK: StorageClass: External (0x2)

View File

@ -52,7 +52,7 @@ LBB0_2: # %return
// CHECK: Symbol {
// CHECK: Name: .weak._test_weak.default
// CHECK-NEXT: Value: 0
// CHECK-NEXT: Section: (-1)
// CHECK-NEXT: Section: (65535)
// CHECK-NEXT: BaseType: Null
// CHECK-NEXT: ComplexType: Null
// CHECK-NEXT: StorageClass: External

View File

@ -317,7 +317,9 @@ static char getSymbolNMTypeChar(COFFObjectFile &Obj, symbol_iterator I) {
return Ret;
uint32_t Characteristics = 0;
if (Symb->SectionNumber > 0) {
if (Symb->SectionNumber > 0 &&
Symb->SectionNumber != llvm::COFF::IMAGE_SYM_DEBUG &&
Symb->SectionNumber != llvm::COFF::IMAGE_SYM_ABSOLUTE) {
section_iterator SecI = Obj.section_end();
if (error(SymI->getSection(SecI)))
return '?';