llvm-6502/test/MC/ARM/elf-reloc-03.ll
Tim Northover 6eb3e87df0 Added Mapping Symbols for ARM ELF
Before this patch, when you objdump an LLVM-compiled file, objdump tried to
decode data-in-code sections as if they were code.  This patch adds the missing
Mapping Symbols, as defined by "ELF for the ARM Architecture" (ARM IHI 0044D).

Patch based on work by Greg Fitzgerald.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@169609 91177308-0d34-0410-b5e6-96231b3b80d8
2012-12-07 16:50:23 +00:00

98 lines
2.7 KiB
LLVM

;; RUN: llc -mtriple=armv7-linux-gnueabi -O3 \
;; RUN: -mcpu=cortex-a8 -mattr=-neon -mattr=+vfp2 -arm-reserve-r9 \
;; RUN: -filetype=obj %s -o - | \
;; RUN: elf-dump --dump-section-data | FileCheck -check-prefix=OBJ %s
;; FIXME: This file needs to be in .s form!
;; The args to llc are there to constrain the codegen only.
;;
;; Ensure no regression on ARM/gcc compatibility for
;; emitting explicit symbol relocs for nonexternal symbols
;; versus section symbol relocs (with offset) -
;;
;; Default llvm behavior is to emit as section symbol relocs nearly
;; everything that is not an undefined external. Unfortunately, this
;; diverges from what codesourcery ARM/gcc does!
;;
;; Verifies that internal constants appear as explict symbol relocs
target triple = "armv7-none-linux-gnueabi"
@startval = global i32 5
@vtable = internal constant [10 x i32 (...)*] [i32 (...)* bitcast (i32 ()* @foo0 to i32 (...)*), i32 (...)* bitcast (i32 ()* @foo1 to i32 (...)*), i32 (...)* bitcast (i32 ()* @foo2 to i32 (...)*), i32 (...)* bitcast (i32 ()* @foo3 to i32 (...)*), i32 (...)* bitcast (i32 ()* @foo4 to i32 (...)*), i32 (...)* bitcast (i32 ()* @foo5 to i32 (...)*), i32 (...)* bitcast (i32 ()* @foo6 to i32 (...)*), i32 (...)* bitcast (i32 ()* @foo7 to i32 (...)*), i32 (...)* bitcast (i32 ()* @foo8 to i32 (...)*), i32 (...)* bitcast (i32 ()* @foo9 to i32 (...)*)]
declare i32 @mystrlen(i8* nocapture %s) nounwind readonly
declare void @myhextochar(i32 %n, i8* nocapture %buffer) nounwind
define internal i32 @foo0() nounwind readnone {
entry:
ret i32 0
}
define internal i32 @foo1() nounwind readnone {
entry:
ret i32 1
}
define internal i32 @foo2() nounwind readnone {
entry:
ret i32 2
}
define internal i32 @foo3() nounwind readnone {
entry:
ret i32 3
}
define internal i32 @foo4() nounwind readnone {
entry:
ret i32 4
}
define internal i32 @foo5() nounwind readnone {
entry:
ret i32 55
}
define internal i32 @foo6() nounwind readnone {
entry:
ret i32 6
}
define internal i32 @foo7() nounwind readnone {
entry:
ret i32 7
}
define internal i32 @foo8() nounwind readnone {
entry:
ret i32 8
}
define internal i32 @foo9() nounwind readnone {
entry:
ret i32 9
}
define i32 @main() nounwind {
entry:
%0 = load i32* @startval, align 4
%1 = getelementptr inbounds [10 x i32 (...)*]* @vtable, i32 0, i32 %0
%2 = load i32 (...)** %1, align 4
%3 = tail call i32 (...)* %2() nounwind
tail call void @exit(i32 %3) noreturn nounwind
unreachable
}
declare void @exit(i32) noreturn nounwind
;; OBJ: Relocation 1
;; OBJ-NEXT: 'r_offset',
;; OBJ-NEXT: 'r_sym', 0x000010
;; OBJ-NEXT: 'r_type', 0x2b
;; OBJ: Symbol 16
;; OBJ-NEXT: 'vtable'