llvm-6502/test/MC/X86
Bruno Cardoso Lopes 6bf5b2b094 [AsmPrinter] Access pointers to globals via pcrel GOT entries
Front-ends could use global unnamed_addr to hold pointers to other
symbols, like @gotequivalent below:

@foo = global i32 42
@gotequivalent = private unnamed_addr constant i32* @foo

@delta = global i32 trunc (i64 sub (i64 ptrtoint (i32** @gotequivalent to i64),
                                    i64 ptrtoint (i32* @delta to i64))
                           to i32)

The global @delta holds a data "PC"-relative offset to @gotequivalent,
an unnamed pointer to @foo. The darwin/x86-64 assembly output for this follows:

 .globl  _foo
_foo:
 .long   42

 .globl  _gotequivalent
_gotequivalent:
 .quad   _foo

 .globl  _delta
_delta:
 .long   _gotequivalent-_delta

Since unnamed_addr indicates that the address is not significant, only
the content, we can optimize the case above by replacing pc-relative
accesses to "GOT equivalent" globals, by a PC relative access to the GOT
entry of the final symbol instead. Therefore, "delta" can contain a pc
relative relocation to foo's GOT entry and we avoid the emission of
"gotequivalent", yielding the assembly code below:

 .globl  _foo
_foo:
 .long   42

 .globl  _delta
_delta:
 .long   _foo@GOTPCREL+4

There are a couple of advantages of doing this: (1) Front-ends that need
to emit a great deal of data to store pointers to external symbols could
save space by not emitting such "got equivalent" globals and (2) IR
constructs combined with this opt opens a way to represent GOT pcrel
relocations by using the LLVM IR, which is something we previously had
no way to express.

Differential Revision: http://reviews.llvm.org/D6922

rdar://problem/18534217

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@230264 91177308-0d34-0410-b5e6-96231b3b80d8
2015-02-23 21:26:18 +00:00
..
AlignedBundling
3DNow.s
2011-09-06-NoNewline.s
address-size.s
avx512-encodings.s [X86] Add assembly parser support for mnemonic aliases for AVX-512 vpcmp instructions. 2015-02-15 07:13:48 +00:00
avx512bw-encoding.s AVX-512: BLENDM - fixed encoding of the broadcast version 2014-12-23 09:36:28 +00:00
avx512vl-encoding.s AVX-512: BLENDM - fixed encoding of the broadcast version 2014-12-23 09:36:28 +00:00
cfi_def_cfa-crash.s
compact-unwind.s [CompactUnwind] Fix register encoding logic 2014-12-08 18:18:32 +00:00
cstexpr-gotpcrel.ll [AsmPrinter] Access pointers to globals via pcrel GOT entries 2015-02-23 21:26:18 +00:00
fde-reloc.s Revert "Reapply 222538 and update tests to explicitly request small code model and PIC:" 2014-11-27 17:13:51 +00:00
fixup-cpu-mode.s
gnux32-dwarf-gen.s
index-operations.s
intel-syntax-2.s
intel-syntax-ambiguous.s
intel-syntax-avx512.s
intel-syntax-bitwise-ops.s
intel-syntax-directional-label.s
intel-syntax-encoding.s
intel-syntax-error.s
intel-syntax-hex.s
intel-syntax-invalid-basereg.s
intel-syntax-invalid-scale.s
intel-syntax-ptr-sized.s
intel-syntax-unsized-memory.s [MC] Reset the MCInst in the matcher function before adding opcode/operands. 2014-12-16 18:05:28 +00:00
intel-syntax.s [X86] Make fxsave64/fxrstor64/xsave64/xsrstor64/xsaveopt64 parseable in AT&T syntax. Also make them the default output. 2015-02-03 11:03:57 +00:00
lit.local.cfg
macho-uleb.s
no-elf-compact-unwind.s
padlock.s
relax-insn.s
reloc-macho.s
reloc-undef-global.s
ret.s
sgx-encoding.s
shuffle-comments.s [X86] And also test INSERTPS shuffle mask pretty-printing. 2014-12-15 19:47:35 +00:00
stackmap-nops.ll
validate-inst-att.s X86: validate 'int' instruction 2015-01-14 05:10:21 +00:00
validate-inst-intel.s X86: validate 'int' instruction 2015-01-14 05:10:21 +00:00
variant-diagnostics.s
x86_64-avx-clmul-encoding.s
x86_64-avx-encoding.s [X86] Improve parsing support AVX/SSE floating point compare instruction mnemonic aliases. They'll now print with the alias the parser received instead of converting to the explicit immediate form. 2015-02-14 21:54:03 +00:00
x86_64-bmi-encoding.s
x86_64-encoding.s [X86] Make fxsave64/fxrstor64/xsave64/xsrstor64/xsaveopt64 parseable in AT&T syntax. Also make them the default output. 2015-02-03 11:03:57 +00:00
x86_64-fma3-encoding.s
x86_64-fma4-encoding.s
x86_64-hle-encoding.s
x86_64-imm-widths.s
x86_64-rand-encoding.s
x86_64-rtm-encoding.s
x86_64-signed-reloc.s
x86_64-sse4a.s
x86_64-tbm-encoding.s
x86_64-xop-encoding.s [X86] Add support for parsing and printing the mnemonic aliases for the XOP VPCOM instructions. 2015-02-13 07:42:25 +00:00
x86_directives.s
x86_errors.s [x86] Add assembly parser bounds checking to the immediate value for cmpss/cmpsd/cmpps/cmppd. 2015-01-21 06:07:53 +00:00
x86_long_nop.s
x86_nop.s
x86_operands.s
x86-16.s
x86-32-avx.s [X86] Improve parsing support AVX/SSE floating point compare instruction mnemonic aliases. They'll now print with the alias the parser received instead of converting to the explicit immediate form. 2015-02-14 21:54:03 +00:00
x86-32-coverage.s [X86] Add GETSEC instruction. 2015-02-07 23:36:36 +00:00
x86-32-fma3.s
x86-32-ms-inline-asm.s
x86-32.s [X86] Improve parsing support AVX/SSE floating point compare instruction mnemonic aliases. They'll now print with the alias the parser received instead of converting to the explicit immediate form. 2015-02-14 21:54:03 +00:00
x86-64-avx512bw_vl.s [AVX512] Added VPBROADCAST{BWDQ} (Load with Broadcast Integer Data from General Purpose Register) encodings for AVX512-BW/VL subsets 2014-12-09 16:38:41 +00:00
x86-64-avx512bw.s [X86] Add assembly parser support for mnemonic aliases for AVX-512 vpcmp instructions. 2015-02-15 07:13:48 +00:00
x86-64-avx512dq_vl.s
x86-64-avx512dq.s
x86-64-avx512f_vl.s [AVX512] Added VPBROADCAST{BWDQ} (Load with Broadcast Integer Data from General Purpose Register) encodings for AVX512-BW/VL subsets 2014-12-09 16:38:41 +00:00
x86-64.s
x86-itanium.ll
x86-target-directives.s
x86-windows-itanium-libcalls.ll