llvm-mirror/lib
Jason W Kim 93cb3f967d This fixes one divergence between LLVM and binutils for ARM in the
text section.

Assume the following bit of annotated assembly:

.section	.data.rel.ro,"aw",%progbits
.align	2
.LAlpha:
.long	startval(GOTOFF)

.text
.align	2
.type	main,%function
.align	4

main: ;;; assume "main" starts at offset 0x20
0x0	push	{r11, lr}
0x4	movw	r0, :lower16:(.LAlpha-(.LBeta+8))
;;; ==> (.AddrOf(.LAlpha) - ((.AddrOf(.LBeta) - .AddrOf(".")) + 8)
;;; ==> (??? - ((16-4) + 8) = -20
0x8	movt	r0, :upper16:(.LAlpha-(.LBeta+8))
;;; ==> (.AddrOf(.LAlpha) - ((.AddrOf(.LBeta) - .AddrOf(".")) + 8)
;;; ==> (??? - ((16-8) + 8) = -16
0xc	... blah

.LBeta:
0x10	add	r0, pc, r0
0x14	... blah

.LGamma:
0x18	add	r1, pc, r1

Above snippet results in the following relocs in the .o file for the
first pair of movw/movt instructions

00000024 R_ARM_MOVW_PREL_NC .LAlpha
00000028 R_ARM_MOVT_PREL .LAlpha

And the encoded instructions in the .o file for main: must be

00000020 <main>:
20:	e92d4800 push	{fp, lr}
24:	e30f0fec movw	r0, #65516	; 0xffec i.e. -20
28:	e34f0ff0 movt	r0, #65520	; 0xfff0 i.e. -16

However, llc (prior to this commit) generates the following sequence

00000020 <main>:
20:	e92d4800 push	{fp, lr}
24:	e30f0fec movw	r0, #65516	; 0xffec - i.e. -20
28:	e34f0fff movt	r0, #65535	; 0xffff - i.e. -1

What has to happen in the ArmAsmBackend is that if the relocation is PC
relative, the 16 bits encoded as part of movw and movt must be both addends,
not addresses. It makes sense to encode addresses by right shifting the value
by 16, but the result is incorrect for PIC.
i.e., the right shift by 16 for movt is ONLY valid for the NON-PCRel case.

This change agrees with what GNU as does, and makes the PIC code run.

MC/ARM/elf-movt.s covers this case.

llvm-svn: 131674
2011-05-19 20:55:25 +00:00
..
Analysis @llvm.lifetime.begin acts as a load, not @llvm.lifetime.end. 2011-05-17 00:05:49 +00:00
Archive Revert PathV2 changes, as sys::fs::unique_file is not finished yet. 2011-03-01 19:50:55 +00:00
AsmParser Remove unused variables caught by GCC's -Wunused-but-set-variable. 2011-05-03 16:00:27 +00:00
Bitcode It's valid to take the blockaddress of a different function, so remove this 2011-05-06 21:09:44 +00:00
CodeGen Update some currently-disabled code, preparing for eventual use. 2011-05-19 18:48:20 +00:00
CompilerDriver Build CompilerDriver library. 2011-03-12 22:01:42 +00:00
ExecutionEngine Avoid a Twine that referenced a tmp (which proceded to go out of scope before 2011-05-19 00:45:05 +00:00
Linker Set the unnamed_addr only when we're creating a new GV in the dest module. 2011-03-29 23:31:06 +00:00
MC Implement the Win64 EH prolog instruction methods on the base MCStreamer. 2011-05-19 19:35:55 +00:00
Object Remove dead variable pointed out by GCC 4.6 warnings, and reflow this a little 2011-05-02 05:05:29 +00:00
Support Revert my previous patch. The cmake build had already been fixed. 2011-05-19 00:02:45 +00:00
Target This fixes one divergence between LLVM and binutils for ARM in the 2011-05-19 20:55:25 +00:00
Transforms Reapply r131605. This time with a fix, which is to use NoFolder. 2011-05-19 20:52:46 +00:00
VMCore Shuffle StandardPasses.cpp into VMCore; add it to CMake. 2011-05-18 23:51:11 +00:00
CMakeLists.txt Build CompilerDriver library. 2011-03-12 22:01:42 +00:00
Makefile Add LLVMObject Library. 2010-11-15 03:21:41 +00:00