]> granicus.if.org Git - llvm/commitdiff
[COFF] Fix .bss section size bug in obj2yaml / yaml2obj
authorReid Kleckner <rnk@google.com>
Fri, 10 May 2019 21:53:44 +0000 (21:53 +0000)
committerReid Kleckner <rnk@google.com>
Fri, 10 May 2019 21:53:44 +0000 (21:53 +0000)
We need to serialize SizeOfRawData through even when there is no data,
as in a .bss section.

Fixes PR41836

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

lib/ObjectYAML/COFFYAML.cpp
test/tools/obj2yaml/coff-bss.s [new file with mode: 0644]
tools/yaml2obj/yaml2coff.cpp

index f206e31b55079dd87df432edf134b885d4dbaa9d..b5154467f11ac8cda310fd8a13cd34f3708df100 100644 (file)
@@ -578,6 +578,12 @@ void MappingTraits<COFFYAML::Section>::mapping(IO &IO, COFFYAML::Section &Sec) {
   else if (Sec.Name == ".debug$H")
     IO.mapOptional("GlobalHashes", Sec.DebugH);
 
+  // Uninitialized sections, such as .bss, typically have no data, but the size
+  // is carried in SizeOfRawData, even though PointerToRawData is zero.
+  if (Sec.SectionData.binary_size() == 0 &&
+      NC->Characteristics & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA)
+    IO.mapOptional("SizeOfRawData", Sec.Header.SizeOfRawData);
+
   IO.mapOptional("Relocations", Sec.Relocations);
 }
 
diff --git a/test/tools/obj2yaml/coff-bss.s b/test/tools/obj2yaml/coff-bss.s
new file mode 100644 (file)
index 0000000..fed5d05
--- /dev/null
@@ -0,0 +1,14 @@
+# RUN: llvm-mc -filetype=obj -triple=x86_64-windows-msvc %s -o %t.obj
+# RUN: llvm-objdump -h %t.obj | FileCheck %s
+# RUN: obj2yaml %t.obj | yaml2obj -o %t.2.obj
+# RUN: llvm-objdump -h %t.2.obj | FileCheck %s
+
+# CHECK: Idx Name          Size     VMA          Type
+# CHECK:     .bss          00000004 0000000000000000 BSS
+
+# Before PR41836, Size would be 0 after yaml conversion.
+
+.bss
+.global gv_bss
+gv_bss:
+.long 0
index e9f1f558201aa1c2616963e7f42a14cab4839a95..3afbd5848af7423b19ce7c15d83ba9447207dd6a 100644 (file)
@@ -259,7 +259,8 @@ static bool layoutCOFF(COFFParser &CP) {
             S.Header.NumberOfRelocations * COFF::RelocationSize;
       }
     } else {
-      S.Header.SizeOfRawData = 0;
+      // Leave SizeOfRawData unaltered. For .bss sections in object files, it
+      // carries the section size.
       S.Header.PointerToRawData = 0;
     }
   }
@@ -496,7 +497,7 @@ static bool writeCOFF(COFFParser &CP, raw_ostream &OS) {
 
   // Output section data.
   for (const COFFYAML::Section &S : CP.Obj.Sections) {
-    if (!S.Header.SizeOfRawData)
+    if (S.Header.SizeOfRawData == 0 || S.Header.PointerToRawData == 0)
       continue;
     assert(S.Header.PointerToRawData >= OS.tell());
     OS.write_zeros(S.Header.PointerToRawData - OS.tell());