Reserve space for the mandatory traceback fields on PPC64.
authorHal Finkel <hfinkel@anl.gov>
Wed, 29 Aug 2012 20:22:24 +0000 (20:22 +0000)
committerHal Finkel <hfinkel@anl.gov>
Wed, 29 Aug 2012 20:22:24 +0000 (20:22 +0000)
We need to reserve space for the mandatory traceback fields,
though leaving them as zero is appropriate for now.

Although the ABI calls for these fields to be filled in fully, no
compiler on Linux currently does this, and GDB does not read these
fields.  GDB uses the first word of zeroes during exception handling to
find the end of the function and the size field, allowing it to compute
the beginning of the function.  DWARF information is used for everything
else.  We need the extra 8 bytes of pad so the size field is found in
the right place.

As a comparison, GCC fills in a few of the fields -- language, number
of saved registers -- but ignores the rest.  IBM's proprietary OSes do
make use of the full traceback table facility.

Patch by Bill Schmidt.

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

lib/Target/PowerPC/PPCAsmPrinter.cpp
test/CodeGen/PowerPC/pr13641.ll

index de3241504dc1a16c9bbf22fa543cd50f6dae4aa1..1c9a23aa6840cb107e0e9c13cb7261e69a33200c 100644 (file)
@@ -458,11 +458,15 @@ bool PPCLinuxAsmPrinter::doFinalization(Module &M) {
 void PPCLinuxAsmPrinter::EmitFunctionBodyEnd() {
   // Only the 64-bit target requires a traceback table.  For now,
   // we only emit the word of zeroes that GDB requires to find
-  // the end of the function.
-  // FIXME: Eventually we should add the eight-byte mandatory fields
-  // described in the PPC64 ELF ABI.
-  if (Subtarget.isPPC64())
+  // the end of the function, and zeroes for the eight-byte
+  // mandatory fields.
+  // FIXME: We should fill in the eight-byte mandatory fields as described in
+  // the PPC64 ELF ABI (this is a low-priority item because GDB does not
+  // currently make use of these fields).
+  if (Subtarget.isPPC64()) {
     OutStreamer.EmitIntValue(0, 4/*size*/);
+    OutStreamer.EmitIntValue(0, 8/*size*/);
+  }
 }
 
 void PPCDarwinAsmPrinter::EmitStartOfAsmFile(Module &M) {
index e80fbea36d625fc55ef8d9d5a263aee40818a6b4..c4d3f3a9dc60d04b0ac4bfff57fc94c87d4f8b09 100644 (file)
@@ -8,3 +8,4 @@ define void @foo() nounwind {
 
 ; CHECK: blr
 ; CHECK-NEXT: .long 0
+; CHECK-NEXT: .quad 0