llvm-6502/test
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
..
Analysis [LoopAccesses] Add -analyze support 2015-02-19 19:15:19 +00:00
Assembler AsmParser: Check ConstantExpr insertvalue operands for type correctness 2015-02-23 07:13:52 +00:00
Bindings [OCaml] Add Llvm.build_empty_phi. 2015-02-06 13:42:03 +00:00
Bitcode Use common parse routine to read alignment values from bitcode 2015-02-22 19:32:03 +00:00
BugPoint
CodeGen [X86][MMX] Fix test to reflect current codegen 2015-02-23 20:57:46 +00:00
DebugInfo [llvm-pdbdump] Add an option to dump full class definitions. 2015-02-23 05:58:34 +00:00
ExecutionEngine Make frem.ll flush after calling printf. 2015-02-18 19:32:28 +00:00
Feature Don't promote asynch EH invokes of nounwind functions to calls 2015-02-11 01:23:16 +00:00
FileCheck
Instrumentation [sanitizer] fix a test broken by r229940 2015-02-20 02:12:25 +00:00
Integer
JitListener
Linker Add run line that was missing in r228999. 2015-02-13 16:00:03 +00:00
LTO Introduce Target::createNullTargetStreamer and use it from IRObjectFile. 2015-02-19 00:45:02 +00:00
MC [AsmPrinter] Access pointers to globals via pcrel GOT entries 2015-02-23 21:26:18 +00:00
Object [obj2yaml/yaml2obj] Add SHT_GROUP support. 2015-02-21 04:28:26 +00:00
Other Don't promote asynch EH invokes of nounwind functions to calls 2015-02-11 01:23:16 +00:00
SymbolRewriter
TableGen
tools InstrProf: Teach llvm-cov to show the max count instead of the last 2015-02-23 21:21:34 +00:00
Transforms Prevent hoisting fmul from THEN/ELSE to IF if there is fmsub/fmadd opportunity. 2015-02-23 19:15:16 +00:00
Unit
Verifier Verifier: Unused comdats might not have a corresponding GV 2015-02-20 19:58:48 +00:00
YAMLParser
.clang-format
CMakeLists.txt Back out two accidental changes that snuck in with r229245. Sorry these 2015-02-14 09:05:58 +00:00
lit.cfg [gold] Consolidate the gold plugin options and actually search for 2015-02-14 09:43:57 +00:00
lit.site.cfg.in Remove log statements from config scripts. 2015-02-22 07:31:42 +00:00
Makefile Attempt to fix the builders. 2015-02-22 07:01:41 +00:00
Makefile.tests
TestRunner.sh