[llvm] r360473 - [COFF] Fix .bss section size bug in obj2yaml / yaml2obj
Reid Kleckner via llvm-commits
llvm-commits at lists.llvm.org
Fri May 10 14:53:44 PDT 2019
Author: rnk
Date: Fri May 10 14:53:44 2019
New Revision: 360473
URL: http://llvm.org/viewvc/llvm-project?rev=360473&view=rev
Log:
[COFF] Fix .bss section size bug in obj2yaml / yaml2obj
We need to serialize SizeOfRawData through even when there is no data,
as in a .bss section.
Fixes PR41836
Added:
llvm/trunk/test/tools/obj2yaml/coff-bss.s
Modified:
llvm/trunk/lib/ObjectYAML/COFFYAML.cpp
llvm/trunk/tools/yaml2obj/yaml2coff.cpp
Modified: llvm/trunk/lib/ObjectYAML/COFFYAML.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ObjectYAML/COFFYAML.cpp?rev=360473&r1=360472&r2=360473&view=diff
==============================================================================
--- llvm/trunk/lib/ObjectYAML/COFFYAML.cpp (original)
+++ llvm/trunk/lib/ObjectYAML/COFFYAML.cpp Fri May 10 14:53:44 2019
@@ -578,6 +578,12 @@ void MappingTraits<COFFYAML::Section>::m
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);
}
Added: llvm/trunk/test/tools/obj2yaml/coff-bss.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/obj2yaml/coff-bss.s?rev=360473&view=auto
==============================================================================
--- llvm/trunk/test/tools/obj2yaml/coff-bss.s (added)
+++ llvm/trunk/test/tools/obj2yaml/coff-bss.s Fri May 10 14:53:44 2019
@@ -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
Modified: llvm/trunk/tools/yaml2obj/yaml2coff.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2coff.cpp?rev=360473&r1=360472&r2=360473&view=diff
==============================================================================
--- llvm/trunk/tools/yaml2obj/yaml2coff.cpp (original)
+++ llvm/trunk/tools/yaml2obj/yaml2coff.cpp Fri May 10 14:53:44 2019
@@ -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, ra
// 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());
More information about the llvm-commits
mailing list