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

Rui Ueyama ruiu at google.com
Fri Mar 14 15:07:52 PDT 2014


On Fri, Mar 14, 2014 at 3:06 PM, Rui Ueyama <ruiu at google.com> wrote:

> Hi Bigcheese,
>
> Microsoft PE/COFF Spec clearly states that the field is of unsigned
> interger
>

Confusing typo: ... clearly states that the field is of *signed* integer

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.
>
> http://llvm-reviews.chandlerc.com/D3088
>
> Files:
>   include/llvm/Object/COFF.h
>   include/llvm/Support/COFF.h
>   test/MC/COFF/feat00.s
>   test/MC/COFF/weak.s
>   tools/llvm-nm/llvm-nm.cpp
>
> Index: include/llvm/Object/COFF.h
> ===================================================================
> --- include/llvm/Object/COFF.h
> +++ include/llvm/Object/COFF.h
> @@ -193,7 +193,7 @@
>    } Name;
>
>    support::ulittle32_t Value;
> -  support::little16_t SectionNumber;
> +  support::ulittle16_t SectionNumber;
>
>    support::ulittle16_t Type;
>
> Index: include/llvm/Support/COFF.h
> ===================================================================
> --- include/llvm/Support/COFF.h
> +++ include/llvm/Support/COFF.h
> @@ -138,8 +138,8 @@
>    };
>
>    enum SymbolSectionNumber {
> -    IMAGE_SYM_DEBUG     = -2,
> -    IMAGE_SYM_ABSOLUTE  = -1,
> +    IMAGE_SYM_DEBUG     = 0xFFFE,
> +    IMAGE_SYM_ABSOLUTE  = 0xFFFF,
>      IMAGE_SYM_UNDEFINED = 0
>    };
>
> Index: test/MC/COFF/feat00.s
> ===================================================================
> --- test/MC/COFF/feat00.s
> +++ test/MC/COFF/feat00.s
> @@ -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)
> Index: test/MC/COFF/weak.s
> ===================================================================
> --- test/MC/COFF/weak.s
> +++ test/MC/COFF/weak.s
> @@ -52,7 +52,7 @@
>  // 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
> Index: tools/llvm-nm/llvm-nm.cpp
> ===================================================================
> --- tools/llvm-nm/llvm-nm.cpp
> +++ tools/llvm-nm/llvm-nm.cpp
> @@ -317,7 +317,9 @@
>      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 '?';
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140314/9ef6bc1a/attachment.html>


More information about the llvm-commits mailing list