[PATCH] Fix ARM EHABI compact model 1 and 2 without handlerdata.

Logan Chien tzuhsiang.chien at gmail.com
Fri Jun 28 21:45:53 PDT 2013


Hi asl,

According to ARM EHABI section 9.2, if the
__aeabi_unwind_cpp_pr1() or __aeabi_unwind_cpp_pr2() is
used, then the handler data must be emitted after the unwind
opcodes.  The handler data consists of several words, and
should be terminated by zero.

In case that the .handlerdata directive is not specified by
the programmer, we should emit zero to terminate the handler
data.

http://llvm-reviews.chandlerc.com/D1068

Files:
  lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
  test/MC/ARM/eh-compact-pr1.s

Index: lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
===================================================================
--- lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
+++ lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
@@ -204,7 +204,7 @@
 
   void EmitPersonalityFixup(StringRef Name);
   void FlushPendingOffset();
-  void FlushUnwindOpcodes(bool AllowCompactModel0);
+  void FlushUnwindOpcodes(bool NoHandlerData);
 
   void SwitchToEHSection(const char *Prefix, unsigned Type, unsigned Flags,
                          SectionKind Kind, const MCSymbol &Fn);
@@ -377,7 +377,7 @@
   }
 }
 
-void ARMELFStreamer::FlushUnwindOpcodes(bool AllowCompactModel0) {
+void ARMELFStreamer::FlushUnwindOpcodes(bool NoHandlerData) {
   // Emit the unwind opcode to restore $sp.
   if (UsedFP) {
     const MCRegisterInfo *MRI = getContext().getRegisterInfo();
@@ -394,7 +394,7 @@
   // For compact model 0, we have to emit the unwind opcodes in the .ARM.exidx
   // section.  Thus, we don't have to create an entry in the .ARM.extab
   // section.
-  if (AllowCompactModel0 && PersonalityIndex == AEABI_UNWIND_CPP_PR0)
+  if (NoHandlerData && PersonalityIndex == AEABI_UNWIND_CPP_PR0)
     return;
 
   // Switch to .ARM.extab section.
@@ -418,6 +418,16 @@
   // Emit unwind opcodes
   EmitBytes(StringRef(reinterpret_cast<const char *>(Opcodes.data()),
                       Opcodes.size()), 0);
+
+  // According to ARM EHABI section 9.2, if the __aeabi_unwind_cpp_pr1() or
+  // __aeabi_unwind_cpp_pr2() is used, then the handler data must be emitted
+  // after the unwind opcodes.  The handler data consists of several 32-bit
+  // words, and should be terminated by zero.
+  //
+  // In case that the .handlerdata directive is not specified by the
+  // programmer, we should emit zero to terminate the handler data.
+  if (NoHandlerData && !Personality)
+    EmitIntValue(0, 4);
 }
 
 void ARMELFStreamer::EmitHandlerData() {
Index: test/MC/ARM/eh-compact-pr1.s
===================================================================
--- test/MC/ARM/eh-compact-pr1.s
+++ test/MC/ARM/eh-compact-pr1.s
@@ -46,7 +46,7 @@
 @ 0xB0   = finish
 @-------------------------------------------------------------------------------
 @ CHECK:     SectionData (
-@ CHECK:       0000: 419B0181 B0B08384                    |A.......|
+@ CHECK:       0000: 419B0181 B0B08384 00000000           |A...........|
 @ CHECK:     )
 @ CHECK:   }
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D1068.1.patch
Type: text/x-patch
Size: 2422 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130628/1806ca99/attachment.bin>


More information about the llvm-commits mailing list