Gas uses encoding DW_EH_PE_absptr for PIC, and gnu ld converts it to DW_EH_PE_sdata4|DW_EH_PE_pcrel. LLD doesn't have this workarounding, thus complains ``` relocation R_MIPS_32 cannot be used against local symbol; recompile with -fPIC relocation R_MIPS_64 cannot be used against local symbol; recompile with -fPIC ``` So, let's generates asm/obj files with `DW_EH_PE_sdata4|DW_EH_PE_pcrel` encoding. In fact, GNU ld supports such OBJs well. For N64, maybe we should use sdata8, while GNU ld doesn't support it well, and in fact sdata4 is enough now. So we just ignore the `Large` for `MCObjectFileInfo::initELFMCObjectFileInfo`. Maybe we should switch back to sdata8 once GNU LD supports it well. Fixes: #58377.
77 lines
2.8 KiB
LLVM
77 lines
2.8 KiB
LLVM
; RUN: llc -mtriple=mipsel-linux-gnu < %s -asm-verbose -relocation-model=pic | \
|
|
; RUN: FileCheck -check-prefixes=ALL,LINUX,LINUX-O32,O32 %s
|
|
; RUN: llc -mtriple=mips64el-linux-gnu -target-abi=n32 < %s -asm-verbose -relocation-model=pic | \
|
|
; RUN: FileCheck -check-prefixes=ALL,LINUX,LINUX-NEW,N32 %s
|
|
; RUN: llc -mtriple=mips64el-linux-gnu < %s -asm-verbose -relocation-model=pic | \
|
|
; RUN: FileCheck -check-prefixes=ALL,LINUX,LINUX-NEW,N64 %s
|
|
; RUN: llc -mtriple=mips64el-linux-gnu < %s -asm-verbose -relocation-model=pic | \
|
|
; RUN: FileCheck -check-prefixes=ALL,LINUX,LINUX-NEW,N64 %s
|
|
; RUN: llc -mtriple=mips-unknown-freebsd11.0 < %s -asm-verbose -relocation-model=pic | \
|
|
; RUN: FileCheck -check-prefixes=ALL,FREEBSD,FREEBSD-O32,O32 %s
|
|
; RUN: llc -mtriple=mips64-unknown-freebsd11.0 < %s -asm-verbose -relocation-model=pic | \
|
|
; RUN: FileCheck -check-prefixes=ALL,FREEBSD,FREEBSD-NEW,N64 %s
|
|
|
|
@_ZTISt9exception = external constant ptr
|
|
|
|
define i32 @main() personality ptr @__gxx_personality_v0 {
|
|
; ALL: .cfi_startproc
|
|
|
|
; Linux must rely on the assembler/linker converting the encodings.
|
|
; LINUX: .cfi_personality 155, DW.ref.__gxx_personality_v0
|
|
; LINUX-O32: .cfi_lsda 27, $exception0
|
|
; LINUX-NEW: .cfi_lsda 27, .Lexception0
|
|
|
|
; FreeBSD can (and must) be more direct about the encodings it wants.
|
|
; FREEBSD: .cfi_personality 155, DW.ref.__gxx_personality_v0
|
|
; FREEBSD-O32: .cfi_lsda 27, $exception0
|
|
; FREEBSD-NEW: .cfi_lsda 27, .Lexception0
|
|
|
|
entry:
|
|
invoke void @foo() to label %cont unwind label %lpad
|
|
; ALL: foo
|
|
; ALL: jalr
|
|
|
|
lpad:
|
|
%0 = landingpad { ptr, i32 }
|
|
catch ptr null
|
|
catch ptr @_ZTISt9exception
|
|
ret i32 0
|
|
|
|
cont:
|
|
ret i32 0
|
|
}
|
|
; ALL: .cfi_endproc
|
|
|
|
declare i32 @__gxx_personality_v0(...)
|
|
|
|
declare void @foo()
|
|
|
|
; ALL: GCC_except_table{{[0-9]+}}:
|
|
; ALL: .byte 155 # @TType Encoding = indirect pcrel sdata4
|
|
; O32: [[PC_LABEL:\$tmp[0-9]+]]:
|
|
; N32: [[PC_LABEL:\.Ltmp[0-9]+]]:
|
|
; N64: [[PC_LABEL:\.Ltmp[0-9]+]]:
|
|
; O32: .4byte ($_ZTISt9exception.DW.stub)-([[PC_LABEL]])
|
|
; N32: .4byte .L_ZTISt9exception.DW.stub-[[PC_LABEL]]
|
|
; N64: .4byte .L_ZTISt9exception.DW.stub-[[PC_LABEL]]
|
|
; O32: $_ZTISt9exception.DW.stub:
|
|
; N32: .L_ZTISt9exception.DW.stub:
|
|
; N64: .L_ZTISt9exception.DW.stub:
|
|
; O32: .4byte _ZTISt9exception
|
|
; N32: .4byte _ZTISt9exception
|
|
; N64: .8byte _ZTISt9exception
|
|
; ALL: .hidden DW.ref.__gxx_personality_v0
|
|
; ALL: .weak DW.ref.__gxx_personality_v0
|
|
; ALL: .section .data.DW.ref.__gxx_personality_v0,"awG",@progbits,DW.ref.__gxx_personality_v0,comdat
|
|
; O32: .p2align 2
|
|
; N32: .p2align 2
|
|
; N64: .p2align 3
|
|
; ALL: .type DW.ref.__gxx_personality_v0,@object
|
|
; O32: .size DW.ref.__gxx_personality_v0, 4
|
|
; N32: .size DW.ref.__gxx_personality_v0, 4
|
|
; N64: .size DW.ref.__gxx_personality_v0, 8
|
|
; ALL: DW.ref.__gxx_personality_v0:
|
|
; O32: .4byte __gxx_personality_v0
|
|
; N32: .4byte __gxx_personality_v0
|
|
; N64: .8byte __gxx_personality_v0
|