mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-11 00:39:36 +00:00
Fix MIPS exception personality encoding.
For MIPS, we have to encode the personality routine with an indirect pointer to absptr; otherwise, some link warning warning will be raised, and the program might crash in some early MIPS Android device. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@209907 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ba735134d7
commit
731d23ed42
@ -59,7 +59,7 @@ void DwarfCFIException::endModule() {
|
||||
|
||||
unsigned PerEncoding = TLOF.getPersonalityEncoding();
|
||||
|
||||
if ((PerEncoding & 0x70) != dwarf::DW_EH_PE_pcrel)
|
||||
if ((PerEncoding & 0x80) != dwarf::DW_EH_PE_indirect)
|
||||
return;
|
||||
|
||||
// Emit references to all used personality functions
|
||||
|
@ -48,16 +48,12 @@ MCSymbol *TargetLoweringObjectFileELF::getCFIPersonalitySymbol(
|
||||
const GlobalValue *GV, Mangler &Mang, const TargetMachine &TM,
|
||||
MachineModuleInfo *MMI) const {
|
||||
unsigned Encoding = getPersonalityEncoding();
|
||||
switch (Encoding & 0x70) {
|
||||
default:
|
||||
report_fatal_error("We do not support this DWARF encoding yet!");
|
||||
case dwarf::DW_EH_PE_absptr:
|
||||
return TM.getSymbol(GV, Mang);
|
||||
case dwarf::DW_EH_PE_pcrel: {
|
||||
if ((Encoding & 0x80) == dwarf::DW_EH_PE_indirect)
|
||||
return getContext().GetOrCreateSymbol(StringRef("DW.ref.") +
|
||||
TM.getSymbol(GV, Mang)->getName());
|
||||
}
|
||||
}
|
||||
if ((Encoding & 0x70) == dwarf::DW_EH_PE_absptr)
|
||||
return TM.getSymbol(GV, Mang);
|
||||
report_fatal_error("We do not support this DWARF encoding yet!");
|
||||
}
|
||||
|
||||
void TargetLoweringObjectFileELF::emitPersonalityValue(MCStreamer &Streamer,
|
||||
|
@ -321,6 +321,13 @@ void MCObjectFileInfo::InitELFMCObjectFileInfo(Triple T) {
|
||||
TTypeEncoding = dwarf::DW_EH_PE_absptr;
|
||||
}
|
||||
break;
|
||||
case Triple::mips:
|
||||
case Triple::mipsel:
|
||||
// MIPS uses indirect pointer to refer personality functions, so that the
|
||||
// eh_frame section can be read-only. DW.ref.personality will be generated
|
||||
// for relocation.
|
||||
PersonalityEncoding = dwarf::DW_EH_PE_indirect;
|
||||
break;
|
||||
case Triple::ppc64:
|
||||
case Triple::ppc64le:
|
||||
PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
|
||||
|
34
test/CodeGen/Mips/ehframe-indirect.ll
Normal file
34
test/CodeGen/Mips/ehframe-indirect.ll
Normal file
@ -0,0 +1,34 @@
|
||||
; RUN: llc -mtriple=mipsel-linux-gnu < %s | FileCheck %s
|
||||
; RUN: llc -mtriple=mipsel-linux-android < %s | FileCheck %s
|
||||
|
||||
define i32 @main() {
|
||||
; CHECK: .cfi_startproc
|
||||
; CHECK: .cfi_personality 128, DW.ref.__gxx_personality_v0
|
||||
|
||||
entry:
|
||||
invoke void @foo() to label %cont unwind label %lpad
|
||||
; CHECK: foo
|
||||
; CHECK: jalr
|
||||
|
||||
lpad:
|
||||
%0 = landingpad { i8*, i32 } personality i8*
|
||||
bitcast (i32 (...)* @__gxx_personality_v0 to i8*) catch i8* null
|
||||
ret i32 0
|
||||
|
||||
cont:
|
||||
ret i32 0
|
||||
}
|
||||
; CHECK: .cfi_endproc
|
||||
|
||||
declare i32 @__gxx_personality_v0(...)
|
||||
|
||||
declare void @foo()
|
||||
|
||||
; CHECK: .hidden DW.ref.__gxx_personality_v0
|
||||
; CHECK: .weak DW.ref.__gxx_personality_v0
|
||||
; CHECK: .section .data.DW.ref.__gxx_personality_v0,"aGw",@progbits,DW.ref.__gxx_personality_v0,comdat
|
||||
; CHECK: .align 2
|
||||
; CHECK: .type DW.ref.__gxx_personality_v0,@object
|
||||
; CHECK: .size DW.ref.__gxx_personality_v0, 4
|
||||
; CHECK: DW.ref.__gxx_personality_v0:
|
||||
; CHECK: .4byte __gxx_personality_v0
|
Loading…
x
Reference in New Issue
Block a user