Files
clang-p2996/llvm/test/CodeGen/Mips/ehframe-indirect.ll
YunQiang Su 8f21294897 MIPS: Use pcrel|sdata4 for eh_frame (#91291)
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.
2024-05-08 17:30:14 +08:00

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