llvm-project/llvm/lib/CodeGen/AsmPrinter
Bruno Cardoso Lopes 24492b057e [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

llvm-svn: 230264
2015-02-23 21:26:18 +00:00
..
ARMException.cpp Use MMI->getPersonality() instead of MMI->getPersonalities()[MMI->getPersonalityIndex()] 2015-01-14 22:47:54 +00:00
AddressPool.cpp DWARF Type Units: Avoid emitting type units under fission if the type requires an address. 2014-04-26 17:27:38 +00:00
AddressPool.h Canonicalize header guards into a common format. 2014-08-13 16:26:38 +00:00
AsmPrinter.cpp [AsmPrinter] Access pointers to globals via pcrel GOT entries 2015-02-23 21:26:18 +00:00
AsmPrinterDwarf.cpp Migrate away a use of the subtarget (and TargetMachine) from 2015-02-19 23:29:42 +00:00
AsmPrinterHandler.h Canonicalize header guards into a common format. 2014-08-13 16:26:38 +00:00
AsmPrinterInlineAsm.cpp Unconditionally create a new MCInstrInfo in the asm printer for 2015-02-21 09:09:15 +00:00
ByteStreamer.h [cleanup] Re-sort all the #include lines in LLVM using 2015-01-14 11:23:27 +00:00
CMakeLists.txt Debug info: Factor out the creation of DWARF expressions from AsmPrinter 2015-01-12 22:19:22 +00:00
DIE.cpp [cleanup] Re-sort all the #include lines in LLVM using 2015-01-14 11:23:27 +00:00
DIEHash.cpp Make DIE.h a public CodeGen header. 2015-01-05 21:29:41 +00:00
DIEHash.h [cleanup] Re-sort all the #include lines in LLVM using 2015-01-14 11:23:27 +00:00
DbgValueHistoryCalculator.cpp DbgValueHistoryCalculator: Store modified registers in a BitVector instead of std::set. 2014-10-06 15:31:04 +00:00
DbgValueHistoryCalculator.h Canonicalize header guards into a common format. 2014-08-13 16:26:38 +00:00
DebugLocEntry.h Debug info: Use DW_OP_bit_piece instead of DW_OP_piece in the 2015-02-09 23:57:15 +00:00
DebugLocList.h [cleanup] Re-sort all the #include lines in LLVM using 2015-01-14 11:23:27 +00:00
DwarfAccelTable.cpp Make DIE.h a public CodeGen header. 2015-01-05 21:29:41 +00:00
DwarfAccelTable.h Removing LLVM_DELETED_FUNCTION, as MSVC 2012 was the last reason for requiring the macro. NFC; LLVM edition. 2015-02-15 22:54:22 +00:00
DwarfCFIException.cpp Classify functions by EH personality type rather than using the triple 2015-01-23 18:49:01 +00:00
DwarfCompileUnit.cpp Used the cached subtarget off of the MachineFunction. 2015-02-20 22:36:11 +00:00
DwarfCompileUnit.h Remove support for DIVariable's FlagIndirectVariable and expect 2015-01-19 17:57:29 +00:00
DwarfDebug.cpp Used the cached subtarget off of the MachineFunction. 2015-02-20 22:36:11 +00:00
DwarfDebug.h 80-column fixups. 2015-02-17 20:02:28 +00:00
DwarfException.h CodeGen: split out the Win64Exception emitter 2014-09-01 23:48:34 +00:00
DwarfExpression.cpp AsmPrinter: Take range in DwarfExpression::AddExpression(), NFC 2015-02-17 22:30:56 +00:00
DwarfExpression.h AsmPrinter: Take range in DwarfExpression::AddExpression(), NFC 2015-02-17 22:30:56 +00:00
DwarfFile.cpp Debug Info: Support variables that are described by more than one MMI 2015-02-10 23:18:28 +00:00
DwarfFile.h Debug Info: Support variables that are described by more than one MMI 2015-02-10 23:18:28 +00:00
DwarfStringPool.cpp Remove StringMap::GetOrCreateValue in favor of StringMap::insert 2014-11-19 05:49:42 +00:00
DwarfStringPool.h [cleanup] Re-sort all the #include lines in LLVM using 2015-01-14 11:23:27 +00:00
DwarfUnit.cpp Make the ARM AsmPrinter independent of global subtarget 2015-02-17 20:02:32 +00:00
DwarfUnit.h [cleanup] Re-sort all the #include lines in LLVM using 2015-01-14 11:23:27 +00:00
EHStreamer.cpp Classify functions by EH personality type rather than using the triple 2015-01-23 18:49:01 +00:00
EHStreamer.h CodeGen support for x86_64 SEH catch handlers in LLVM 2015-01-14 01:05:27 +00:00
ErlangGCPrinter.cpp Compute the ELF SectionKind from the flags. 2015-01-29 17:33:21 +00:00
LLVMBuild.txt Add proper dependencies to LLVMBuild.txt in llvm/lib. 2013-12-10 05:39:34 +00:00
Makefile
OcamlGCPrinter.cpp Move DataLayout back to the TargetMachine from TargetSubtargetInfo 2015-01-26 19:03:15 +00:00
Win64Exception.cpp Unify the two EH personality classification routines I wrote 2015-02-14 00:21:02 +00:00
Win64Exception.h CodeGen support for x86_64 SEH catch handlers in LLVM 2015-01-14 01:05:27 +00:00
WinCodeViewLineTables.cpp Temporary fix for PR21528 - use mangled C++ function names in COFF debug info to un-break ASan on Windows 2014-11-12 20:21:20 +00:00
WinCodeViewLineTables.h Canonicalize header guards into a common format. 2014-08-13 16:26:38 +00:00