Skip to content

Commit

Permalink
Revert "[ARM] __cxa_end_cleanup should be called instead of _UnwindRe…
Browse files Browse the repository at this point in the history
…sume."

This reverts commit da1d1a0.
  • Loading branch information
DanielKristofKiss committed Oct 27, 2021
1 parent e76a9f1 commit 894ddba
Show file tree
Hide file tree
Showing 9 changed files with 107 additions and 157 deletions.
19 changes: 10 additions & 9 deletions libcxxabi/src/cxa_exception.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -341,10 +341,8 @@ unwinding with _Unwind_Resume.
According to ARM EHABI 8.4.1, __cxa_end_cleanup() should not clobber any
register, thus we have to write this function in assembly so that we can save
{r1, r2, r3}. We don't have to save r0 because it is the return value and the
first argument to _Unwind_Resume(). In addition, we are saving lr in order to
align the stack to 16 bytes and lr will be used to identify the caller and its
frame information. _Unwind_Resume never return and we need to keep the original
lr so just branch to it.
first argument to _Unwind_Resume(). In addition, we are saving r4 in order to
align the stack to 16 bytes, even though it is a callee-save register.
*/
__attribute__((used)) static _Unwind_Exception *
__cxa_end_cleanup_impl()
Expand Down Expand Up @@ -374,15 +372,18 @@ __cxa_end_cleanup_impl()
return &exception_header->unwindHeader;
}

asm(" .pushsection .text.__cxa_end_cleanup,\"ax\",%progbits\n"
asm (
" .pushsection .text.__cxa_end_cleanup,\"ax\",%progbits\n"
" .globl __cxa_end_cleanup\n"
" .type __cxa_end_cleanup,%function\n"
"__cxa_end_cleanup:\n"
" push {r1, r2, r3, lr}\n"
" push {r1, r2, r3, r4}\n"
" bl __cxa_end_cleanup_impl\n"
" pop {r1, r2, r3, lr}\n"
" b _Unwind_Resume\n"
" .popsection");
" pop {r1, r2, r3, r4}\n"
" bl _Unwind_Resume\n"
" bl abort\n"
" .popsection"
);
#endif // defined(_LIBCXXABI_ARM_EHABI)

/*
Expand Down
12 changes: 0 additions & 12 deletions llvm/include/llvm/ADT/Triple.h
Original file line number Diff line number Diff line change
Expand Up @@ -721,18 +721,6 @@ class Triple {
return getArch() == Triple::arm || getArch() == Triple::armeb;
}

/// Tests whether the target supports the EHABI exception
/// handling standard.
bool isTargetEHABICompatible() const {
return (getEnvironment() == Triple::EABI ||
getEnvironment() == Triple::GNUEABI ||
getEnvironment() == Triple::MuslEABI ||
getEnvironment() == Triple::EABIHF ||
getEnvironment() == Triple::GNUEABIHF ||
getEnvironment() == Triple::MuslEABIHF || isAndroid()) &&
isOSBinFormatELF();
}

/// Tests whether the target is AArch64 (little and big endian).
bool isAArch64() const {
return getArch() == Triple::aarch64 || getArch() == Triple::aarch64_be ||
Expand Down
1 change: 0 additions & 1 deletion llvm/include/llvm/IR/RuntimeLibcalls.def
Original file line number Diff line number Diff line change
Expand Up @@ -432,7 +432,6 @@ HANDLE_LIBCALL(MEMSET_ELEMENT_UNORDERED_ATOMIC_16, "__llvm_memset_element_unorde

// Exception handling
HANDLE_LIBCALL(UNWIND_RESUME, "_Unwind_Resume")
HANDLE_LIBCALL(CXA_END_CLEANUP, "__cxa_end_cleanup")

// Note: there are two sets of atomics libcalls; see
// <https://llvm.org/docs/Atomics.html> for more info on the
Expand Down
79 changes: 31 additions & 48 deletions llvm/lib/CodeGen/DwarfEHPrepare.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/Triple.h"
#include "llvm/Analysis/CFG.h"
#include "llvm/Analysis/DomTreeUpdater.h"
#include "llvm/Analysis/EHPersonalities.h"
Expand Down Expand Up @@ -55,11 +54,13 @@ namespace {
class DwarfEHPrepare {
CodeGenOpt::Level OptLevel;

// RewindFunction - _Unwind_Resume or the target equivalent.
FunctionCallee &RewindFunction;

Function &F;
const TargetLowering &TLI;
DomTreeUpdater *DTU;
const TargetTransformInfo *TTI;
const Triple &TargetTriple;

/// Return the exception object from the value passed into
/// the 'resume' instruction (typically an aggregate). Clean up any dead
Expand All @@ -77,11 +78,11 @@ class DwarfEHPrepare {
bool InsertUnwindResumeCalls();

public:
DwarfEHPrepare(CodeGenOpt::Level OptLevel_, Function &F_,
const TargetLowering &TLI_, DomTreeUpdater *DTU_,
const TargetTransformInfo *TTI_, const Triple &TargetTriple_)
: OptLevel(OptLevel_), F(F_), TLI(TLI_), DTU(DTU_), TTI(TTI_),
TargetTriple(TargetTriple_) {}
DwarfEHPrepare(CodeGenOpt::Level OptLevel_, FunctionCallee &RewindFunction_,
Function &F_, const TargetLowering &TLI_, DomTreeUpdater *DTU_,
const TargetTransformInfo *TTI_)
: OptLevel(OptLevel_), RewindFunction(RewindFunction_), F(F_), TLI(TLI_),
DTU(DTU_), TTI(TTI_) {}

bool run();
};
Expand Down Expand Up @@ -210,28 +211,13 @@ bool DwarfEHPrepare::InsertUnwindResumeCalls() {
if (ResumesLeft == 0)
return true; // We pruned them all.

// RewindFunction - _Unwind_Resume or the target equivalent.
FunctionCallee RewindFunction;
CallingConv::ID RewindFunctionCallingConv;
FunctionType *FTy;
const char *RewindName;
bool DoesRewindFunctionNeedExceptionObject;

if ((Pers == EHPersonality::GNU_CXX || Pers == EHPersonality::GNU_CXX_SjLj) &&
TargetTriple.isTargetEHABICompatible()) {
RewindName = TLI.getLibcallName(RTLIB::CXA_END_CLEANUP);
FTy = FunctionType::get(Type::getVoidTy(Ctx), false);
RewindFunctionCallingConv =
TLI.getLibcallCallingConv(RTLIB::CXA_END_CLEANUP);
DoesRewindFunctionNeedExceptionObject = false;
} else {
RewindName = TLI.getLibcallName(RTLIB::UNWIND_RESUME);
FTy =
// Find the rewind function if we didn't already.
if (!RewindFunction) {
FunctionType *FTy =
FunctionType::get(Type::getVoidTy(Ctx), Type::getInt8PtrTy(Ctx), false);
RewindFunctionCallingConv = TLI.getLibcallCallingConv(RTLIB::UNWIND_RESUME);
DoesRewindFunctionNeedExceptionObject = true;
const char *RewindName = TLI.getLibcallName(RTLIB::UNWIND_RESUME);
RewindFunction = F.getParent()->getOrInsertFunction(RewindName, FTy);
}
RewindFunction = F.getParent()->getOrInsertFunction(RewindName, FTy);

// Create the basic block where the _Unwind_Resume call will live.
if (ResumesLeft == 1) {
Expand All @@ -240,14 +226,10 @@ bool DwarfEHPrepare::InsertUnwindResumeCalls() {
ResumeInst *RI = Resumes.front();
BasicBlock *UnwindBB = RI->getParent();
Value *ExnObj = GetExceptionObject(RI);
llvm::SmallVector<Value *, 1> RewindFunctionArgs;
if (DoesRewindFunctionNeedExceptionObject)
RewindFunctionArgs.push_back(ExnObj);

// Call the rewind function.
CallInst *CI =
CallInst::Create(RewindFunction, RewindFunctionArgs, "", UnwindBB);
CI->setCallingConv(RewindFunctionCallingConv);
// Call the _Unwind_Resume function.
CallInst *CI = CallInst::Create(RewindFunction, ExnObj, "", UnwindBB);
CI->setCallingConv(TLI.getLibcallCallingConv(RTLIB::UNWIND_RESUME));

// We never expect _Unwind_Resume to return.
CI->setDoesNotReturn();
Expand All @@ -258,8 +240,6 @@ bool DwarfEHPrepare::InsertUnwindResumeCalls() {
std::vector<DominatorTree::UpdateType> Updates;
Updates.reserve(Resumes.size());

llvm::SmallVector<Value *, 1> RewindFunctionArgs;

BasicBlock *UnwindBB = BasicBlock::Create(Ctx, "unwind_resume", &F);
PHINode *PN = PHINode::Create(Type::getInt8PtrTy(Ctx), ResumesLeft, "exn.obj",
UnwindBB);
Expand All @@ -277,13 +257,9 @@ bool DwarfEHPrepare::InsertUnwindResumeCalls() {
++NumResumesLowered;
}

if (DoesRewindFunctionNeedExceptionObject)
RewindFunctionArgs.push_back(PN);

// Call the function.
CallInst *CI =
CallInst::Create(RewindFunction, RewindFunctionArgs, "", UnwindBB);
CI->setCallingConv(RewindFunctionCallingConv);
CallInst *CI = CallInst::Create(RewindFunction, PN, "", UnwindBB);
CI->setCallingConv(TLI.getLibcallCallingConv(RTLIB::UNWIND_RESUME));

// We never expect _Unwind_Resume to return.
CI->setDoesNotReturn();
Expand All @@ -301,20 +277,22 @@ bool DwarfEHPrepare::run() {
return Changed;
}

static bool prepareDwarfEH(CodeGenOpt::Level OptLevel, Function &F,
static bool prepareDwarfEH(CodeGenOpt::Level OptLevel,
FunctionCallee &RewindFunction, Function &F,
const TargetLowering &TLI, DominatorTree *DT,
const TargetTransformInfo *TTI,
const Triple &TargetTriple) {
const TargetTransformInfo *TTI) {
DomTreeUpdater DTU(DT, DomTreeUpdater::UpdateStrategy::Lazy);

return DwarfEHPrepare(OptLevel, F, TLI, DT ? &DTU : nullptr, TTI,
TargetTriple)
return DwarfEHPrepare(OptLevel, RewindFunction, F, TLI, DT ? &DTU : nullptr,
TTI)
.run();
}

namespace {

class DwarfEHPrepareLegacyPass : public FunctionPass {
// RewindFunction - _Unwind_Resume or the target equivalent.
FunctionCallee RewindFunction = nullptr;

CodeGenOpt::Level OptLevel;

Expand All @@ -337,7 +315,12 @@ class DwarfEHPrepareLegacyPass : public FunctionPass {
DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
TTI = &getAnalysis<TargetTransformInfoWrapperPass>().getTTI(F);
}
return prepareDwarfEH(OptLevel, F, TLI, DT, TTI, TM.getTargetTriple());
return prepareDwarfEH(OptLevel, RewindFunction, F, TLI, DT, TTI);
}

bool doFinalization(Module &M) override {
RewindFunction = nullptr;
return false;
}

void getAnalysisUsage(AnalysisUsage &AU) const override {
Expand Down
9 changes: 8 additions & 1 deletion llvm/lib/Target/ARM/ARMSubtarget.h
Original file line number Diff line number Diff line change
Expand Up @@ -792,7 +792,14 @@ class ARMSubtarget : public ARMGenSubtargetInfo {
// ARM Targets that support EHABI exception handling standard
// Darwin uses SjLj. Other targets might need more checks.
bool isTargetEHABICompatible() const {
return TargetTriple.isTargetEHABICompatible();
return (TargetTriple.getEnvironment() == Triple::EABI ||
TargetTriple.getEnvironment() == Triple::GNUEABI ||
TargetTriple.getEnvironment() == Triple::MuslEABI ||
TargetTriple.getEnvironment() == Triple::EABIHF ||
TargetTriple.getEnvironment() == Triple::GNUEABIHF ||
TargetTriple.getEnvironment() == Triple::MuslEABIHF ||
isTargetAndroid()) &&
!isTargetDarwin() && !isTargetWindows();
}

bool isTargetHardFloat() const;
Expand Down
68 changes: 37 additions & 31 deletions llvm/test/CodeGen/ARM/debug-frame.ll
Original file line number Diff line number Diff line change
Expand Up @@ -197,27 +197,29 @@ declare void @_ZSt9terminatev()

; CHECK-V7-FP-LABEL: _Z4testiiiiiddddd:
; CHECK-V7-FP: .cfi_startproc
; CHECK-V7-FP: push {r11, lr}
; CHECK-V7-FP: .cfi_def_cfa_offset 8
; CHECK-V7-FP: push {r4, r10, r11, lr}
; CHECK-V7-FP: .cfi_def_cfa_offset 16
; CHECK-V7-FP: .cfi_offset lr, -4
; CHECK-V7-FP: .cfi_offset r11, -8
; CHECK-V7-FP: mov r11, sp
; CHECK-V7-FP: .cfi_def_cfa_register r11
; CHECK-V7-FP: .cfi_offset r10, -12
; CHECK-V7-FP: .cfi_offset r4, -16
; CHECK-V7-FP: add r11, sp, #8
; CHECK-V7-FP: .cfi_def_cfa r11, 8
; CHECK-V7-FP: vpush {d8, d9, d10, d11, d12}
; CHECK-V7-FP: .cfi_offset d12, -16
; CHECK-V7-FP: .cfi_offset d11, -24
; CHECK-V7-FP: .cfi_offset d10, -32
; CHECK-V7-FP: .cfi_offset d9, -40
; CHECK-V7-FP: .cfi_offset d8, -48
; CHECK-V7-FP: .cfi_offset d12, -24
; CHECK-V7-FP: .cfi_offset d11, -32
; CHECK-V7-FP: .cfi_offset d10, -40
; CHECK-V7-FP: .cfi_offset d9, -48
; CHECK-V7-FP: .cfi_offset d8, -56
; CHECK-V7-FP: sub sp, sp, #24
; CHECK-V7-FP: .cfi_endproc

; CHECK-V7-FP-ELIM-LABEL: _Z4testiiiiiddddd:
; CHECK-V7-FP-ELIM: .cfi_startproc
; CHECK-V7-FP-ELIM: push {r11, lr}
; CHECK-V7-FP-ELIM: push {r4, lr}
; CHECK-V7-FP-ELIM: .cfi_def_cfa_offset 8
; CHECK-V7-FP-ELIM: .cfi_offset lr, -4
; CHECK-V7-FP-ELIM: .cfi_offset r11, -8
; CHECK-V7-FP-ELIM: .cfi_offset r4, -8
; CHECK-V7-FP-ELIM: vpush {d8, d9, d10, d11, d12}
; CHECK-V7-FP-ELIM: .cfi_def_cfa_offset 48
; CHECK-V7-FP-ELIM: .cfi_offset d12, -16
Expand Down Expand Up @@ -258,27 +260,29 @@ declare void @_ZSt9terminatev()

; CHECK-THUMB-V7-FP-LABEL: _Z4testiiiiiddddd:
; CHECK-THUMB-V7-FP: .cfi_startproc
; CHECK-THUMB-V7-FP: push {r7, lr}
; CHECK-THUMB-V7-FP: .cfi_def_cfa_offset 8
; CHECK-THUMB-V7-FP: push {r4, r6, r7, lr}
; CHECK-THUMB-V7-FP: .cfi_def_cfa_offset 16
; CHECK-THUMB-V7-FP: .cfi_offset lr, -4
; CHECK-THUMB-V7-FP: .cfi_offset r7, -8
; CHECK-THUMB-V7-FP: mov r7, sp
; CHECK-THUMB-V7-FP: .cfi_def_cfa_register r7
; CHECK-THUMB-V7-FP: .cfi_offset r6, -12
; CHECK-THUMB-V7-FP: .cfi_offset r4, -16
; CHECK-THUMB-V7-FP: add r7, sp, #8
; CHECK-THUMB-V7-FP: .cfi_def_cfa r7, 8
; CHECK-THUMB-V7-FP: vpush {d8, d9, d10, d11, d12}
; CHECK-THUMB-V7-FP: .cfi_offset d12, -16
; CHECK-THUMB-V7-FP: .cfi_offset d11, -24
; CHECK-THUMB-V7-FP: .cfi_offset d10, -32
; CHECK-THUMB-V7-FP: .cfi_offset d9, -40
; CHECK-THUMB-V7-FP: .cfi_offset d8, -48
; CHECK-THUMB-V7-FP: .cfi_offset d12, -24
; CHECK-THUMB-V7-FP: .cfi_offset d11, -32
; CHECK-THUMB-V7-FP: .cfi_offset d10, -40
; CHECK-THUMB-V7-FP: .cfi_offset d9, -48
; CHECK-THUMB-V7-FP: .cfi_offset d8, -56
; CHECK-THUMB-V7-FP: sub sp, #24
; CHECK-THUMB-V7-FP: .cfi_endproc

; CHECK-THUMB-V7-FP-ELIM-LABEL: _Z4testiiiiiddddd:
; CHECK-THUMB-V7-FP-ELIM: .cfi_startproc
; CHECK-THUMB-V7-FP-ELIM: push {r7, lr}
; CHECK-THUMB-V7-FP-ELIM: push {r4, lr}
; CHECK-THUMB-V7-FP-ELIM: .cfi_def_cfa_offset 8
; CHECK-THUMB-V7-FP-ELIM: .cfi_offset lr, -4
; CHECK-THUMB-V7-FP-ELIM: .cfi_offset r7, -8
; CHECK-THUMB-V7-FP-ELIM: .cfi_offset r4, -8
; CHECK-THUMB-V7-FP-ELIM: vpush {d8, d9, d10, d11, d12}
; CHECK-THUMB-V7-FP-ELIM: .cfi_def_cfa_offset 48
; CHECK-THUMB-V7-FP-ELIM: .cfi_offset d12, -16
Expand All @@ -292,18 +296,20 @@ declare void @_ZSt9terminatev()

; CHECK-THUMB-V7-FP-NOIAS-LABEL: _Z4testiiiiiddddd:
; CHECK-THUMB-V7-FP-NOIAS: .cfi_startproc
; CHECK-THUMB-V7-FP-NOIAS: push {r7, lr}
; CHECK-THUMB-V7-FP-NOIAS: .cfi_def_cfa_offset 8
; CHECK-THUMB-V7-FP-NOIAS: push {r4, r6, r7, lr}
; CHECK-THUMB-V7-FP-NOIAS: .cfi_def_cfa_offset 16
; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 14, -4
; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 7, -8
; CHECK-THUMB-V7-FP-NOIAS: mov r7, sp
; CHECK-THUMB-V7-FP-NOIAS: .cfi_def_cfa_register 7
; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 6, -12
; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 4, -16
; CHECK-THUMB-V7-FP-NOIAS: add r7, sp, #8
; CHECK-THUMB-V7-FP-NOIAS: .cfi_def_cfa 7, 8
; CHECK-THUMB-V7-FP-NOIAS: vpush {d8, d9, d10, d11, d12}
; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 268, -16
; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 267, -24
; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 266, -32
; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 265, -40
; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 264, -48
; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 268, -24
; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 267, -32
; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 266, -40
; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 265, -48
; CHECK-THUMB-V7-FP-NOIAS: .cfi_offset 264, -56
; CHECK-THUMB-V7-FP-NOIAS: sub sp, #24
; CHECK-THUMB-V7-FP-NOIAS: .cfi_endproc

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@
; RUN: llc < %s -mtriple=armv7-apple-watchos -arm-atomic-cfg-tidy=0 | FileCheck %s -check-prefix=IOS
; RUN: llc < %s -mtriple=armv7k-apple-ios -arm-atomic-cfg-tidy=0 | FileCheck %s -check-prefix=WATCHABI
; RUN: llc < %s -mtriple=armv7k-apple-watchos -arm-atomic-cfg-tidy=0 | FileCheck %s -check-prefix=WATCHABI
; RUN: llc < %s -mtriple=armv7-none-gnueabihf -arm-atomic-cfg-tidy=0 | FileCheck %s -check-prefix=EABI
; RUN: llc < %s -mtriple=armv7-none-none -arm-atomic-cfg-tidy=0 | FileCheck %s -check-prefix=ABI

declare void @func()

Expand All @@ -25,5 +23,3 @@ lpad:

; IOS: __Unwind_SjLj_Resume
; WATCHABI: __Unwind_Resume
; EABI: __cxa_end_cleanup
; ABI: _Unwind_Resume
32 changes: 0 additions & 32 deletions llvm/test/CodeGen/ARM/eh-resume2.ll

This file was deleted.

Loading

0 comments on commit 894ddba

Please sign in to comment.