mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-03 11:08:32 +00:00
ARM: emit hidden stubs into a proper non_lazy_symbol_pointer section.
rdar://problem/16660411 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207517 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
0f79399dee
commit
8ea9566fee
@ -457,6 +457,29 @@ void ARMAsmPrinter::EmitStartOfAsmFile(Module &M) {
|
||||
emitAttributes();
|
||||
}
|
||||
|
||||
static void
|
||||
emitNonLazySymbolPointer(MCStreamer &OutStreamer, MCSymbol *StubLabel,
|
||||
MachineModuleInfoImpl::StubValueTy &MCSym) {
|
||||
// L_foo$stub:
|
||||
OutStreamer.EmitLabel(StubLabel);
|
||||
// .indirect_symbol _foo
|
||||
OutStreamer.EmitSymbolAttribute(MCSym.getPointer(), MCSA_IndirectSymbol);
|
||||
|
||||
if (MCSym.getInt())
|
||||
// External to current translation unit.
|
||||
OutStreamer.EmitIntValue(0, 4/*size*/);
|
||||
else
|
||||
// Internal to current translation unit.
|
||||
//
|
||||
// When we place the LSDA into the TEXT section, the type info
|
||||
// pointers need to be indirect and pc-rel. We accomplish this by
|
||||
// using NLPs; however, sometimes the types are local to the file.
|
||||
// We need to fill in the value for the NLP in those cases.
|
||||
OutStreamer.EmitValue(
|
||||
MCSymbolRefExpr::Create(MCSym.getPointer(), OutStreamer.getContext()),
|
||||
4 /*size*/);
|
||||
}
|
||||
|
||||
|
||||
void ARMAsmPrinter::EmitEndOfAsmFile(Module &M) {
|
||||
if (Subtarget->isTargetMachO()) {
|
||||
@ -473,27 +496,9 @@ void ARMAsmPrinter::EmitEndOfAsmFile(Module &M) {
|
||||
// Switch with ".non_lazy_symbol_pointer" directive.
|
||||
OutStreamer.SwitchSection(TLOFMacho.getNonLazySymbolPointerSection());
|
||||
EmitAlignment(2);
|
||||
for (unsigned i = 0, e = Stubs.size(); i != e; ++i) {
|
||||
// L_foo$stub:
|
||||
OutStreamer.EmitLabel(Stubs[i].first);
|
||||
// .indirect_symbol _foo
|
||||
MachineModuleInfoImpl::StubValueTy &MCSym = Stubs[i].second;
|
||||
OutStreamer.EmitSymbolAttribute(MCSym.getPointer(),MCSA_IndirectSymbol);
|
||||
|
||||
if (MCSym.getInt())
|
||||
// External to current translation unit.
|
||||
OutStreamer.EmitIntValue(0, 4/*size*/);
|
||||
else
|
||||
// Internal to current translation unit.
|
||||
//
|
||||
// When we place the LSDA into the TEXT section, the type info
|
||||
// pointers need to be indirect and pc-rel. We accomplish this by
|
||||
// using NLPs; however, sometimes the types are local to the file.
|
||||
// We need to fill in the value for the NLP in those cases.
|
||||
OutStreamer.EmitValue(MCSymbolRefExpr::Create(MCSym.getPointer(),
|
||||
OutContext),
|
||||
4/*size*/);
|
||||
}
|
||||
for (auto &Stub : Stubs)
|
||||
emitNonLazySymbolPointer(OutStreamer, Stub.first, Stub.second);
|
||||
|
||||
Stubs.clear();
|
||||
OutStreamer.AddBlankLine();
|
||||
@ -501,17 +506,11 @@ void ARMAsmPrinter::EmitEndOfAsmFile(Module &M) {
|
||||
|
||||
Stubs = MMIMacho.GetHiddenGVStubList();
|
||||
if (!Stubs.empty()) {
|
||||
OutStreamer.SwitchSection(getObjFileLowering().getDataSection());
|
||||
OutStreamer.SwitchSection(TLOFMacho.getNonLazySymbolPointerSection());
|
||||
EmitAlignment(2);
|
||||
for (unsigned i = 0, e = Stubs.size(); i != e; ++i) {
|
||||
// L_foo$stub:
|
||||
OutStreamer.EmitLabel(Stubs[i].first);
|
||||
// .long _foo
|
||||
OutStreamer.EmitValue(MCSymbolRefExpr::
|
||||
Create(Stubs[i].second.getPointer(),
|
||||
OutContext),
|
||||
4/*size*/);
|
||||
}
|
||||
|
||||
for (auto &Stub : Stubs)
|
||||
emitNonLazySymbolPointer(OutStreamer, Stub.first, Stub.second);
|
||||
|
||||
Stubs.clear();
|
||||
OutStreamer.AddBlankLine();
|
||||
|
22
test/CodeGen/ARM/indirect-hidden.ll
Normal file
22
test/CodeGen/ARM/indirect-hidden.ll
Normal file
@ -0,0 +1,22 @@
|
||||
; RUN: llc -mtriple=thumbv7s-apple-ios7.0 -o - %s | FileCheck %s
|
||||
|
||||
@var = external global i32
|
||||
@var_hidden = external hidden global i32
|
||||
|
||||
define i32* @get_var() {
|
||||
ret i32* @var
|
||||
}
|
||||
|
||||
define i32* @get_var_hidden() {
|
||||
ret i32* @var_hidden
|
||||
}
|
||||
|
||||
; CHECK: .section __DATA,__nl_symbol_ptr,non_lazy_symbol_pointers
|
||||
|
||||
; CHECK: .indirect_symbol _var
|
||||
; CHECK-NEXT: .long 0
|
||||
|
||||
; CHECK-NOT: __DATA,__data
|
||||
|
||||
; CHECK: .indirect_symbol _var_hidden
|
||||
; CHECK-NEXT: .long 0
|
Loading…
x
Reference in New Issue
Block a user