mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-10-04 16:01:46 +00:00
6bf5b2b094
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 |
||
---|---|---|
.. | ||
AlignedBundling | ||
3DNow.s | ||
2011-09-06-NoNewline.s | ||
address-size.s | ||
avx512-encodings.s | ||
avx512bw-encoding.s | ||
avx512vl-encoding.s | ||
cfi_def_cfa-crash.s | ||
compact-unwind.s | ||
cstexpr-gotpcrel.ll | ||
fde-reloc.s | ||
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 | ||
intel-syntax.s | ||
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 | ||
stackmap-nops.ll | ||
validate-inst-att.s | ||
validate-inst-intel.s | ||
variant-diagnostics.s | ||
x86_64-avx-clmul-encoding.s | ||
x86_64-avx-encoding.s | ||
x86_64-bmi-encoding.s | ||
x86_64-encoding.s | ||
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_directives.s | ||
x86_errors.s | ||
x86_long_nop.s | ||
x86_nop.s | ||
x86_operands.s | ||
x86-16.s | ||
x86-32-avx.s | ||
x86-32-coverage.s | ||
x86-32-fma3.s | ||
x86-32-ms-inline-asm.s | ||
x86-32.s | ||
x86-64-avx512bw_vl.s | ||
x86-64-avx512bw.s | ||
x86-64-avx512dq_vl.s | ||
x86-64-avx512dq.s | ||
x86-64-avx512f_vl.s | ||
x86-64.s | ||
x86-itanium.ll | ||
x86-target-directives.s | ||
x86-windows-itanium-libcalls.ll |