<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Fri, Mar 14, 2014 at 3:06 PM, Rui Ueyama <span dir="ltr"><<a href="mailto:ruiu@google.com" target="_blank">ruiu@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

Hi Bigcheese,<br>
<br>
Microsoft PE/COFF Spec clearly states that the field is of unsigned interger<br></blockquote><div><br></div><div>Confusing typo: ... clearly states that the field is of <i>signed</i> integer</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


type. However, in reality, it's unsigned. If cl.exe needs to create a large<br>
number of sections for COMDAT sections, it will just create more than 32768<br>
sections. Handling large section number as negative number is not correct.<br>
I think this is a spec bug.<br>
<br>
<a href="http://llvm-reviews.chandlerc.com/D3088" target="_blank">http://llvm-reviews.chandlerc.com/D3088</a><br>
<br>
Files:<br>
  include/llvm/Object/COFF.h<br>
  include/llvm/Support/COFF.h<br>
  test/MC/COFF/feat00.s<br>
  test/MC/COFF/weak.s<br>
  tools/llvm-nm/llvm-nm.cpp<br>
<br>
Index: include/llvm/Object/COFF.h<br>
===================================================================<br>
--- include/llvm/Object/COFF.h<br>
+++ include/llvm/Object/COFF.h<br>
@@ -193,7 +193,7 @@<br>
   } Name;<br>
<br>
   support::ulittle32_t Value;<br>
-  support::little16_t SectionNumber;<br>
+  support::ulittle16_t SectionNumber;<br>
<br>
   support::ulittle16_t Type;<br>
<br>
Index: include/llvm/Support/COFF.h<br>
===================================================================<br>
--- include/llvm/Support/COFF.h<br>
+++ include/llvm/Support/COFF.h<br>
@@ -138,8 +138,8 @@<br>
   };<br>
<br>
   enum SymbolSectionNumber {<br>
-    IMAGE_SYM_DEBUG     = -2,<br>
-    IMAGE_SYM_ABSOLUTE  = -1,<br>
+    IMAGE_SYM_DEBUG     = 0xFFFE,<br>
+    IMAGE_SYM_ABSOLUTE  = 0xFFFF,<br>
     IMAGE_SYM_UNDEFINED = 0<br>
   };<br>
<br>
Index: test/MC/COFF/feat00.s<br>
===================================================================<br>
--- test/MC/COFF/feat00.s<br>
+++ test/MC/COFF/feat00.s<br>
@@ -6,7 +6,7 @@<br>
 // CHECK: Symbol {<br>
 // CHECK:   Name: @feat.00<br>
 // CHECK:   Value: 123<br>
-// CHECK:   Section: (-1)<br>
+// CHECK:   Section: (65535)<br>
 // CHECK:   BaseType: Null (0x0)<br>
 // CHECK:   ComplexType: Null (0x0)<br>
 // CHECK:   StorageClass: External (0x2)<br>
Index: test/MC/COFF/weak.s<br>
===================================================================<br>
--- test/MC/COFF/weak.s<br>
+++ test/MC/COFF/weak.s<br>
@@ -52,7 +52,7 @@<br>
 // CHECK:      Symbol {<br>
 // CHECK:        Name:                .weak._test_weak.default<br>
 // CHECK-NEXT:   Value:               0<br>
-// CHECK-NEXT:   Section:             (-1)<br>
+// CHECK-NEXT:   Section:             (65535)<br>
 // CHECK-NEXT:   BaseType:            Null<br>
 // CHECK-NEXT:   ComplexType:         Null<br>
 // CHECK-NEXT:   StorageClass:        External<br>
Index: tools/llvm-nm/llvm-nm.cpp<br>
===================================================================<br>
--- tools/llvm-nm/llvm-nm.cpp<br>
+++ tools/llvm-nm/llvm-nm.cpp<br>
@@ -317,7 +317,9 @@<br>
     return Ret;<br>
<br>
   uint32_t Characteristics = 0;<br>
-  if (Symb->SectionNumber > 0) {<br>
+  if (Symb->SectionNumber > 0 &&<br>
+      Symb->SectionNumber != llvm::COFF::IMAGE_SYM_DEBUG &&<br>
+      Symb->SectionNumber != llvm::COFF::IMAGE_SYM_ABSOLUTE) {<br>
     section_iterator SecI = Obj.section_end();<br>
     if (error(SymI->getSection(SecI)))<br>
       return '?';<br>
</blockquote></div><br></div></div>