Skip to content

Commit

Permalink
Fix ARM EHABI compact model 1 and 2 without handlerdata.
Browse files Browse the repository at this point in the history
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.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@185422 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
loganchien committed Jul 2, 2013
1 parent e5cb25f commit 0a39e26
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 4 deletions.
16 changes: 13 additions & 3 deletions lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ class ARMELFStreamer : public MCELFStreamer {

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);
Expand Down Expand Up @@ -377,7 +377,7 @@ void ARMELFStreamer::FlushPendingOffset() {
}
}

void ARMELFStreamer::FlushUnwindOpcodes(bool AllowCompactModel0) {
void ARMELFStreamer::FlushUnwindOpcodes(bool NoHandlerData) {
// Emit the unwind opcode to restore $sp.
if (UsedFP) {
const MCRegisterInfo *MRI = getContext().getRegisterInfo();
Expand All @@ -394,7 +394,7 @@ void ARMELFStreamer::FlushUnwindOpcodes(bool AllowCompactModel0) {
// 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.
Expand All @@ -418,6 +418,16 @@ void ARMELFStreamer::FlushUnwindOpcodes(bool AllowCompactModel0) {
// 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() {
Expand Down
2 changes: 1 addition & 1 deletion test/MC/ARM/eh-compact-pr1.s
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ func1:
@ 0xB0 = finish
@-------------------------------------------------------------------------------
@ CHECK: SectionData (
@ CHECK: 0000: 419B0181 B0B08384 |A.......|
@ CHECK: 0000: 419B0181 B0B08384 00000000 |A...........|
@ CHECK: )
@ CHECK: }

Expand Down

0 comments on commit 0a39e26

Please sign in to comment.