diff --git a/lld/test/ELF/lto/arm-wrap-personality.ll b/lld/test/ELF/lto/arm-wrap-personality.ll new file mode 100644 --- /dev/null +++ b/lld/test/ELF/lto/arm-wrap-personality.ll @@ -0,0 +1,33 @@ +; Wrapped symbols are marked as weak for LTO to inhibit IPO. The ARM backend was +; previously explicitly marking the personality function as global, so if we +; attempted to wrap the personality function, its initial binding would be weak +; and then the ARM backend would attempt to change it to global, causing an +; error. Verify that the ARM backend no longer does this and we can successfully +; wrap the personality symbol. + +; REQUIRES: arm + +; RUN: llvm-as -o %t.bc %s +; RUN: ld.lld -shared --wrap __gxx_personality_v0 %t.bc -o %t.so +; RUN: llvm-readelf --dyn-syms %t.so | FileCheck %s + +; CHECK: GLOBAL {{.*}} __wrap___gxx_personality_v0 +; CHECK: WEAK {{.*}} __gxx_personality_v0 + +target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64" +target triple = "armv7-none-linux-android" + +define i32 @__gxx_personality_v0(...) { + ret i32 0 +} + +define void @dummy() optnone noinline personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { + invoke void @dummy() to label %cont unwind label %lpad + +cont: + ret void + +lpad: + %lp = landingpad { i8*, i32 } cleanup + resume { i8*, i32 } %lp +} diff --git a/llvm/lib/CodeGen/AsmPrinter/ARMException.cpp b/llvm/lib/CodeGen/AsmPrinter/ARMException.cpp --- a/llvm/lib/CodeGen/AsmPrinter/ARMException.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/ARMException.cpp @@ -75,7 +75,6 @@ // Emit references to personality. if (Per) { MCSymbol *PerSym = Asm->getSymbol(Per); - Asm->OutStreamer->emitSymbolAttribute(PerSym, MCSA_Global); ATS.emitPersonality(PerSym); }