mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:32:44 +01:00
94c1bcf630
When emitting the difference between two symbols, the standard behavior is that the difference will be resolved to an absolute value if both of the symbols are offsets from the same data fragment. This is undesirable on architectures such as RISC-V where relaxation in the linker may cause the computed difference to become invalid. This caused an issue when compiling to object code, where the size of a function in the debug information was already calculated even though it could change as a consequence of relaxation in the subsequent linking stage. This patch inhibits the resolution of symbol differences to absolute values where the target's AsmBackend has declared that it does not want these to be folded. Differential Revision: https://reviews.llvm.org/D45773 Patch by Edward Jones. llvm-svn: 339864
47 lines
1.8 KiB
LLVM
47 lines
1.8 KiB
LLVM
; RUN: llc -filetype=obj -mtriple=riscv32 -mattr=+relax %s -o - \
|
|
; RUN: | llvm-readobj -r | FileCheck -check-prefix=RELAX %s
|
|
; RUN: llc -filetype=obj -mtriple=riscv32 -mattr=-relax %s -o - \
|
|
; RUN: | llvm-readobj -r | FileCheck -check-prefix=NORELAX %s
|
|
|
|
; Check that a difference between two symbols in the same fragment
|
|
; causes relocations to be emitted if and only if relaxation is enabled.
|
|
;
|
|
; This specific test is checking that the size of the function in
|
|
; the debug information is represented by a relocation. This isn't
|
|
; an assembly test as the assembler takes a different path through
|
|
; LLVM, which is already covered by the fixups-expr.s test.
|
|
|
|
source_filename = "tmp.c"
|
|
target datalayout = "e-m:e-p:32:32-i64:64-n32-S128"
|
|
target triple = "riscv32"
|
|
|
|
define i32 @main() !dbg !7 {
|
|
entry:
|
|
%retval = alloca i32, align 4
|
|
store i32 0, i32* %retval, align 4
|
|
ret i32 0
|
|
}
|
|
|
|
; RELAX: 0x22 R_RISCV_ADD32 - 0x0
|
|
; RELAX: 0x22 R_RISCV_SUB32 - 0x0
|
|
; RELAX: 0x2B R_RISCV_ADD32 - 0x0
|
|
; RELAX: 0x2B R_RISCV_SUB32 - 0x0
|
|
; NORELAX-NOT: R_RISCV_ADD32
|
|
|
|
!llvm.dbg.cu = !{!0}
|
|
!llvm.module.flags = !{!3, !4, !5}
|
|
!llvm.ident = !{!6}
|
|
|
|
!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
|
|
!1 = !DIFile(filename: "fixups-diff.ll", directory: "test/MC/RISCV")
|
|
!2 = !{}
|
|
!3 = !{i32 2, !"Dwarf Version", i32 4}
|
|
!4 = !{i32 2, !"Debug Info Version", i32 3}
|
|
!5 = !{i32 1, !"wchar_size", i32 4}
|
|
!6 = !{!"clang"}
|
|
!7 = distinct !DISubprogram(name: "main", scope: !1, file: !1, line: 1, type: !8, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: false, unit: !0)
|
|
!8 = !DISubroutineType(types: !9)
|
|
!9 = !{!10}
|
|
!10 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
|
|
!11 = !DILocation(line: 2, column: 3, scope: !7)
|