summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTanya Lattner <tonic@nondot.org>2009-09-12 22:49:19 +0000
committerTanya Lattner <tonic@nondot.org>2009-09-12 22:49:19 +0000
commitd76a68e5a71ffe5fdc940092bfbd001c1eb6227e (patch)
tree7a2baa5784e50cadea448f14118da4a70a3825b8
parent031fdbb7e8a406dbfc5cf57f6aa5e1b75d31d285 (diff)
downloadllvm-d76a68e5a71ffe5fdc940092bfbd001c1eb6227e.tar.gz
Merge 80404 from mainline.
Let Darwin linker auto-synthesize stubs and lazy-pointers. This deletes a bunch of nasty code in ARM asm printer. git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_26@81647 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Target/ARM/ARMCodeEmitter.cpp11
-rw-r--r--lib/Target/ARM/ARMConstantPoolValue.cpp16
-rw-r--r--lib/Target/ARM/ARMConstantPoolValue.h16
-rw-r--r--lib/Target/ARM/ARMISelLowering.cpp46
-rw-r--r--lib/Target/ARM/ARMSubtarget.cpp11
-rw-r--r--lib/Target/ARM/ARMSubtarget.h5
-rw-r--r--lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp147
-rw-r--r--test/CodeGen/ARM/stubs.ll67
-rw-r--r--test/CodeGen/Thumb2/thumb2-call.ll2
9 files changed, 59 insertions, 262 deletions
diff --git a/lib/Target/ARM/ARMCodeEmitter.cpp b/lib/Target/ARM/ARMCodeEmitter.cpp
index 4713b926e931..cd0c9da133a8 100644
--- a/lib/Target/ARM/ARMCodeEmitter.cpp
+++ b/lib/Target/ARM/ARMCodeEmitter.cpp
@@ -423,16 +423,9 @@ void Emitter<CodeEmitter>::emitConstPoolInstruction(const MachineInstr &MI) {
GlobalValue *GV = ACPV->getGV();
if (GV) {
- assert(!ACPV->isStub() && "Don't know how to deal this yet!");
- if (ACPV->isNonLazyPointer())
- MCE.addRelocation(MachineRelocation::getIndirectSymbol(
- MCE.getCurrentPCOffset(), ARM::reloc_arm_machine_cp_entry, GV,
- (intptr_t)ACPV, false));
- else
- emitGlobalAddress(GV, ARM::reloc_arm_machine_cp_entry,
- ACPV->isStub() || isa<Function>(GV), (intptr_t)ACPV);
+ emitGlobalAddress(GV, ARM::reloc_arm_machine_cp_entry,
+ isa<Function>(GV), (intptr_t)ACPV);
} else {
- assert(!ACPV->isNonLazyPointer() && "Don't know how to deal this yet!");
emitExternalSymbolAddress(ACPV->getSymbol(), ARM::reloc_arm_absolute);
}
emitWordLE(0);
diff --git a/lib/Target/ARM/ARMConstantPoolValue.cpp b/lib/Target/ARM/ARMConstantPoolValue.cpp
index 9697422c6dc2..b5f6f4188a12 100644
--- a/lib/Target/ARM/ARMConstantPoolValue.cpp
+++ b/lib/Target/ARM/ARMConstantPoolValue.cpp
@@ -21,29 +21,25 @@
using namespace llvm;
ARMConstantPoolValue::ARMConstantPoolValue(GlobalValue *gv, unsigned id,
- ARMCP::ARMCPKind k,
unsigned char PCAdj,
const char *Modif,
bool AddCA)
: MachineConstantPoolValue((const Type*)gv->getType()),
- GV(gv), S(NULL), LabelId(id), Kind(k), PCAdjust(PCAdj),
+ GV(gv), S(NULL), LabelId(id), PCAdjust(PCAdj),
Modifier(Modif), AddCurrentAddress(AddCA) {}
ARMConstantPoolValue::ARMConstantPoolValue(LLVMContext &C,
const char *s, unsigned id,
- ARMCP::ARMCPKind k,
unsigned char PCAdj,
const char *Modif,
bool AddCA)
: MachineConstantPoolValue((const Type*)Type::getInt32Ty(C)),
- GV(NULL), S(strdup(s)), LabelId(id), Kind(k), PCAdjust(PCAdj),
+ GV(NULL), S(strdup(s)), LabelId(id), PCAdjust(PCAdj),
Modifier(Modif), AddCurrentAddress(AddCA) {}
-ARMConstantPoolValue::ARMConstantPoolValue(GlobalValue *gv,
- ARMCP::ARMCPKind k,
- const char *Modif)
+ARMConstantPoolValue::ARMConstantPoolValue(GlobalValue *gv, const char *Modif)
: MachineConstantPoolValue((const Type*)Type::getInt32Ty(gv->getContext())),
- GV(gv), S(NULL), LabelId(0), Kind(k), PCAdjust(0),
+ GV(gv), S(NULL), LabelId(0), PCAdjust(0),
Modifier(Modif) {}
int ARMConstantPoolValue::getExistingMachineCPValue(MachineConstantPool *CP,
@@ -58,7 +54,6 @@ int ARMConstantPoolValue::getExistingMachineCPValue(MachineConstantPool *CP,
if (CPV->GV == GV &&
CPV->S == S &&
CPV->LabelId == LabelId &&
- CPV->Kind == Kind &&
CPV->PCAdjust == PCAdjust)
return i;
}
@@ -76,7 +71,6 @@ ARMConstantPoolValue::AddSelectionDAGCSEId(FoldingSetNodeID &ID) {
ID.AddPointer(GV);
ID.AddPointer(S);
ID.AddInteger(LabelId);
- ID.AddInteger((unsigned)Kind);
ID.AddInteger(PCAdjust);
}
@@ -94,8 +88,6 @@ void ARMConstantPoolValue::print(raw_ostream &O) const {
O << GV->getName();
else
O << S;
- if (isNonLazyPointer()) O << "$non_lazy_ptr";
- else if (isStub()) O << "$stub";
if (Modifier) O << "(" << Modifier << ")";
if (PCAdjust != 0) {
O << "-(LPC" << LabelId << "+" << (unsigned)PCAdjust;
diff --git a/lib/Target/ARM/ARMConstantPoolValue.h b/lib/Target/ARM/ARMConstantPoolValue.h
index 13683a300780..d8eb454b68c4 100644
--- a/lib/Target/ARM/ARMConstantPoolValue.h
+++ b/lib/Target/ARM/ARMConstantPoolValue.h
@@ -22,14 +22,6 @@ namespace llvm {
class GlobalValue;
class LLVMContext;
-namespace ARMCP {
- enum ARMCPKind {
- CPValue,
- CPNonLazyPtr,
- CPStub
- };
-}
-
/// ARMConstantPoolValue - ARM specific constantpool value. This is used to
/// represent PC relative displacement between the address of the load
/// instruction and the global value being loaded, i.e. (&GV-(LPIC+8)).
@@ -37,7 +29,6 @@ class ARMConstantPoolValue : public MachineConstantPoolValue {
GlobalValue *GV; // GlobalValue being loaded.
const char *S; // ExtSymbol being loaded.
unsigned LabelId; // Label id of the load.
- ARMCP::ARMCPKind Kind; // non_lazy_ptr or stub?
unsigned char PCAdjust; // Extra adjustment if constantpool is pc relative.
// 8 for ARM, 4 for Thumb.
const char *Modifier; // GV modifier i.e. (&GV(modifier)-(LPIC+8))
@@ -45,15 +36,12 @@ class ARMConstantPoolValue : public MachineConstantPoolValue {
public:
ARMConstantPoolValue(GlobalValue *gv, unsigned id,
- ARMCP::ARMCPKind Kind = ARMCP::CPValue,
unsigned char PCAdj = 0, const char *Modifier = NULL,
bool AddCurrentAddress = false);
ARMConstantPoolValue(LLVMContext &C, const char *s, unsigned id,
- ARMCP::ARMCPKind Kind = ARMCP::CPValue,
unsigned char PCAdj = 0, const char *Modifier = NULL,
bool AddCurrentAddress = false);
- ARMConstantPoolValue(GlobalValue *GV, ARMCP::ARMCPKind Kind,
- const char *Modifier);
+ ARMConstantPoolValue(GlobalValue *GV, const char *Modifier);
ARMConstantPoolValue();
~ARMConstantPoolValue();
@@ -64,8 +52,6 @@ public:
bool hasModifier() const { return Modifier != NULL; }
bool mustAddCurrentAddress() const { return AddCurrentAddress; }
unsigned getLabelId() const { return LabelId; }
- bool isNonLazyPointer() const { return Kind == ARMCP::CPNonLazyPtr; }
- bool isStub() const { return Kind == ARMCP::CPStub; }
unsigned char getPCAdjustment() const { return PCAdjust; }
virtual unsigned getRelocationInfo() const {
diff --git a/lib/Target/ARM/ARMISelLowering.cpp b/lib/Target/ARM/ARMISelLowering.cpp
index 7d8362c93dab..bcd3ba4cc29a 100644
--- a/lib/Target/ARM/ARMISelLowering.cpp
+++ b/lib/Target/ARM/ARMISelLowering.cpp
@@ -975,8 +975,8 @@ ARMTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
isLocalARMFunc = !Subtarget->isThumb() && !isExt;
// tBX takes a register source operand.
if (isARMFunc && Subtarget->isThumb1Only() && !Subtarget->hasV5TOps()) {
- ARMConstantPoolValue *CPV = new ARMConstantPoolValue(GV, ARMPCLabelIndex,
- ARMCP::CPStub, 4);
+ ARMConstantPoolValue *CPV = new ARMConstantPoolValue(GV,
+ ARMPCLabelIndex, 4);
SDValue CPAddr = DAG.getTargetConstantPool(CPV, getPointerTy(), 4);
CPAddr = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, CPAddr);
Callee = DAG.getLoad(getPointerTy(), dl,
@@ -995,8 +995,7 @@ ARMTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
const char *Sym = S->getSymbol();
if (isARMFunc && Subtarget->isThumb1Only() && !Subtarget->hasV5TOps()) {
ARMConstantPoolValue *CPV = new ARMConstantPoolValue(*DAG.getContext(),
- Sym, ARMPCLabelIndex,
- ARMCP::CPStub, 4);
+ Sym, ARMPCLabelIndex, 4);
SDValue CPAddr = DAG.getTargetConstantPool(CPV, getPointerTy(), 4);
CPAddr = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, CPAddr);
Callee = DAG.getLoad(getPointerTy(), dl,
@@ -1173,7 +1172,7 @@ ARMTargetLowering::LowerToTLSGeneralDynamicModel(GlobalAddressSDNode *GA,
EVT PtrVT = getPointerTy();
unsigned char PCAdj = Subtarget->isThumb() ? 4 : 8;
ARMConstantPoolValue *CPV =
- new ARMConstantPoolValue(GA->getGlobal(), ARMPCLabelIndex, ARMCP::CPValue,
+ new ARMConstantPoolValue(GA->getGlobal(), ARMPCLabelIndex,
PCAdj, "tlsgd", true);
SDValue Argument = DAG.getTargetConstantPool(CPV, PtrVT, 4);
Argument = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, Argument);
@@ -1215,7 +1214,7 @@ ARMTargetLowering::LowerToTLSExecModels(GlobalAddressSDNode *GA,
// initial exec model
unsigned char PCAdj = Subtarget->isThumb() ? 4 : 8;
ARMConstantPoolValue *CPV =
- new ARMConstantPoolValue(GA->getGlobal(), ARMPCLabelIndex, ARMCP::CPValue,
+ new ARMConstantPoolValue(GA->getGlobal(), ARMPCLabelIndex,
PCAdj, "gottpoff", true);
Offset = DAG.getTargetConstantPool(CPV, PtrVT, 4);
Offset = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, Offset);
@@ -1228,8 +1227,7 @@ ARMTargetLowering::LowerToTLSExecModels(GlobalAddressSDNode *GA,
Offset = DAG.getLoad(PtrVT, dl, Chain, Offset, NULL, 0);
} else {
// local exec model
- ARMConstantPoolValue *CPV =
- new ARMConstantPoolValue(GV, ARMCP::CPValue, "tpoff");
+ ARMConstantPoolValue *CPV = new ARMConstantPoolValue(GV, "tpoff");
Offset = DAG.getTargetConstantPool(CPV, PtrVT, 4);
Offset = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, Offset);
Offset = DAG.getLoad(PtrVT, dl, Chain, Offset, NULL, 0);
@@ -1263,7 +1261,7 @@ SDValue ARMTargetLowering::LowerGlobalAddressELF(SDValue Op,
if (RelocM == Reloc::PIC_) {
bool UseGOTOFF = GV->hasLocalLinkage() || GV->hasHiddenVisibility();
ARMConstantPoolValue *CPV =
- new ARMConstantPoolValue(GV, ARMCP::CPValue, UseGOTOFF ? "GOTOFF":"GOT");
+ new ARMConstantPoolValue(GV, UseGOTOFF ? "GOTOFF" : "GOT");
SDValue CPAddr = DAG.getTargetConstantPool(CPV, PtrVT, 4);
CPAddr = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, CPAddr);
SDValue Result = DAG.getLoad(PtrVT, dl, DAG.getEntryNode(),
@@ -1281,34 +1279,19 @@ SDValue ARMTargetLowering::LowerGlobalAddressELF(SDValue Op,
}
}
-/// GVIsIndirectSymbol - true if the GV will be accessed via an indirect symbol
-/// even in non-static mode.
-static bool GVIsIndirectSymbol(GlobalValue *GV, Reloc::Model RelocM) {
- // If symbol visibility is hidden, the extra load is not needed if
- // the symbol is definitely defined in the current translation unit.
- bool isDecl = GV->isDeclaration() || GV->hasAvailableExternallyLinkage();
- if (GV->hasHiddenVisibility() && (!isDecl && !GV->hasCommonLinkage()))
- return false;
- return RelocM != Reloc::Static && (isDecl || GV->isWeakForLinker());
-}
-
SDValue ARMTargetLowering::LowerGlobalAddressDarwin(SDValue Op,
SelectionDAG &DAG) {
EVT PtrVT = getPointerTy();
DebugLoc dl = Op.getDebugLoc();
GlobalValue *GV = cast<GlobalAddressSDNode>(Op)->getGlobal();
Reloc::Model RelocM = getTargetMachine().getRelocationModel();
- bool IsIndirect = GVIsIndirectSymbol(GV, RelocM);
SDValue CPAddr;
if (RelocM == Reloc::Static)
CPAddr = DAG.getTargetConstantPool(GV, PtrVT, 4);
else {
- unsigned PCAdj = (RelocM != Reloc::PIC_)
- ? 0 : (Subtarget->isThumb() ? 4 : 8);
- ARMCP::ARMCPKind Kind = IsIndirect ? ARMCP::CPNonLazyPtr
- : ARMCP::CPValue;
- ARMConstantPoolValue *CPV = new ARMConstantPoolValue(GV, ARMPCLabelIndex,
- Kind, PCAdj);
+ unsigned PCAdj = (RelocM != Reloc::PIC_) ? 0 : (Subtarget->isThumb()?4:8);
+ ARMConstantPoolValue *CPV =
+ new ARMConstantPoolValue(GV, ARMPCLabelIndex, PCAdj);
CPAddr = DAG.getTargetConstantPool(CPV, PtrVT, 4);
}
CPAddr = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, CPAddr);
@@ -1320,7 +1303,8 @@ SDValue ARMTargetLowering::LowerGlobalAddressDarwin(SDValue Op,
SDValue PICLabel = DAG.getConstant(ARMPCLabelIndex++, MVT::i32);
Result = DAG.getNode(ARMISD::PIC_ADD, dl, PtrVT, Result, PICLabel);
}
- if (IsIndirect)
+
+ if (Subtarget->GVIsIndirectSymbol(GV, RelocM == Reloc::Static))
Result = DAG.getLoad(PtrVT, dl, Chain, Result, NULL, 0);
return Result;
@@ -1335,8 +1319,7 @@ SDValue ARMTargetLowering::LowerGLOBAL_OFFSET_TABLE(SDValue Op,
unsigned PCAdj = Subtarget->isThumb() ? 4 : 8;
ARMConstantPoolValue *CPV = new ARMConstantPoolValue(*DAG.getContext(),
"_GLOBAL_OFFSET_TABLE_",
- ARMPCLabelIndex,
- ARMCP::CPValue, PCAdj);
+ ARMPCLabelIndex, PCAdj);
SDValue CPAddr = DAG.getTargetConstantPool(CPV, PtrVT, 4);
CPAddr = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, CPAddr);
SDValue Result = DAG.getLoad(PtrVT, dl, DAG.getEntryNode(), CPAddr, NULL, 0);
@@ -1417,14 +1400,13 @@ ARMTargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) {
SDValue CPAddr;
unsigned PCAdj = (RelocM != Reloc::PIC_)
? 0 : (Subtarget->isThumb() ? 4 : 8);
- ARMCP::ARMCPKind Kind = ARMCP::CPValue;
// Save off the LSDA name for the AsmPrinter to use when it's time
// to emit the table
std::string LSDAName = "L_lsda_";
LSDAName += MF.getFunction()->getName();
ARMConstantPoolValue *CPV =
new ARMConstantPoolValue(*DAG.getContext(), LSDAName.c_str(),
- ARMPCLabelIndex, Kind, PCAdj);
+ ARMPCLabelIndex, PCAdj);
CPAddr = DAG.getTargetConstantPool(CPV, PtrVT, 4);
CPAddr = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, CPAddr);
SDValue Result =
diff --git a/lib/Target/ARM/ARMSubtarget.cpp b/lib/Target/ARM/ARMSubtarget.cpp
index ba63ff42caf5..67669cc7b849 100644
--- a/lib/Target/ARM/ARMSubtarget.cpp
+++ b/lib/Target/ARM/ARMSubtarget.cpp
@@ -13,6 +13,7 @@
#include "ARMSubtarget.h"
#include "ARMGenSubtarget.inc"
+#include "llvm/GlobalValue.h"
#include "llvm/Target/TargetOptions.h"
#include "llvm/Support/CommandLine.h"
using namespace llvm;
@@ -92,3 +93,13 @@ ARMSubtarget::ARMSubtarget(const std::string &TT, const std::string &FS,
if (isTargetDarwin())
IsR9Reserved = ReserveR9 | (ARMArchVersion < V6);
}
+
+/// GVIsIndirectSymbol - true if the GV will be accessed via an indirect symbol.
+bool ARMSubtarget::GVIsIndirectSymbol(GlobalValue *GV, bool isStatic) const {
+ // If symbol visibility is hidden, the extra load is not needed if
+ // the symbol is definitely defined in the current translation unit.
+ bool isDecl = GV->isDeclaration() || GV->hasAvailableExternallyLinkage();
+ if (GV->hasHiddenVisibility() && (!isDecl && !GV->hasCommonLinkage()))
+ return false;
+ return !isStatic && (isDecl || GV->isWeakForLinker());
+}
diff --git a/lib/Target/ARM/ARMSubtarget.h b/lib/Target/ARM/ARMSubtarget.h
index ca0a98ea7829..73f9736188da 100644
--- a/lib/Target/ARM/ARMSubtarget.h
+++ b/lib/Target/ARM/ARMSubtarget.h
@@ -19,6 +19,7 @@
#include <string>
namespace llvm {
+class GlobalValue;
class ARMSubtarget : public TargetSubtarget {
protected:
@@ -129,6 +130,10 @@ protected:
/// stack frame on entry to the function and which must be maintained by every
/// function for this subtarget.
unsigned getStackAlignment() const { return stackAlignment; }
+
+ /// GVIsIndirectSymbol - true if the GV will be accessed via an indirect
+ /// symbol.
+ bool GVIsIndirectSymbol(GlobalValue *GV, bool isStatic) const;
};
} // End llvm namespace
diff --git a/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp b/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp
index 4b0f92f6ce90..a93e80d60f70 100644
--- a/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp
+++ b/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp
@@ -79,34 +79,6 @@ namespace {
/// visibility that require non-lazy-pointers for indirect access.
StringMap<std::string> HiddenGVNonLazyPtrs;
- struct FnStubInfo {
- std::string Stub, LazyPtr, SLP, SCV;
-
- FnStubInfo() {}
-
- void Init(const GlobalValue *GV, Mangler *Mang) {
- // Already initialized.
- if (!Stub.empty()) return;
- Stub = Mang->getMangledName(GV, "$stub", true);
- LazyPtr = Mang->getMangledName(GV, "$lazy_ptr", true);
- SLP = Mang->getMangledName(GV, "$slp", true);
- SCV = Mang->getMangledName(GV, "$scv", true);
- }
-
- void Init(const std::string &GV, Mangler *Mang) {
- // Already initialized.
- if (!Stub.empty()) return;
- Stub = Mang->makeNameProper(GV + "$stub", Mangler::Private);
- LazyPtr = Mang->makeNameProper(GV + "$lazy_ptr", Mangler::Private);
- SLP = Mang->makeNameProper(GV + "$slp", Mangler::Private);
- SCV = Mang->makeNameProper(GV + "$scv", Mangler::Private);
- }
- };
-
- /// FnStubs - Keeps the set of external function GlobalAddresses that the
- /// asm printer should generate stubs for.
- StringMap<FnStubInfo> FnStubs;
-
/// True if asm printer is printing a series of CONSTPOOL_ENTRY.
bool InCPMode;
public:
@@ -188,36 +160,26 @@ namespace {
GlobalValue *GV = ACPV->getGV();
std::string Name;
-
- if (ACPV->isNonLazyPointer()) {
- std::string SymName = Mang->getMangledName(GV);
- Name = Mang->getMangledName(GV, "$non_lazy_ptr", true);
-
- if (GV->hasHiddenVisibility())
- HiddenGVNonLazyPtrs[SymName] = Name;
- else
- GVNonLazyPtrs[SymName] = Name;
- } else if (ACPV->isStub()) {
- if (GV) {
- FnStubInfo &FnInfo = FnStubs[Mang->getMangledName(GV)];
- FnInfo.Init(GV, Mang);
- Name = FnInfo.Stub;
- } else {
- FnStubInfo &FnInfo = FnStubs[Mang->makeNameProper(ACPV->getSymbol())];
- FnInfo.Init(ACPV->getSymbol(), Mang);
- Name = FnInfo.Stub;
- }
- } else {
- if (GV)
+ if (GV) {
+ bool isIndirect = Subtarget->isTargetDarwin() &&
+ Subtarget->GVIsIndirectSymbol(GV,
+ TM.getRelocationModel() == Reloc::Static);
+ if (!isIndirect)
Name = Mang->getMangledName(GV);
- else if (!strncmp(ACPV->getSymbol(), "L_lsda_", 7))
- Name = ACPV->getSymbol();
- else
- Name = Mang->makeNameProper(ACPV->getSymbol());
- }
- O << Name;
-
-
+ else {
+ // FIXME: Remove this when Darwin transition to @GOT like syntax.
+ std::string SymName = Mang->getMangledName(GV);
+ Name = Mang->getMangledName(GV, "$non_lazy_ptr", true);
+ if (GV->hasHiddenVisibility())
+ HiddenGVNonLazyPtrs[SymName] = Name;
+ else
+ GVNonLazyPtrs[SymName] = Name;
+ }
+ } else if (!strncmp(ACPV->getSymbol(), "L_lsda_", 7))
+ Name = ACPV->getSymbol();
+ else
+ Name = Mang->makeNameProper(ACPV->getSymbol());
+ O << Name;
if (ACPV->hasModifier()) O << "(" << ACPV->getModifier() << ")";
if (ACPV->getPCAdjustment() != 0) {
@@ -372,18 +334,7 @@ void ARMAsmPrinter::printOperand(const MachineInstr *MI, int OpNum,
case MachineOperand::MO_GlobalAddress: {
bool isCallOp = Modifier && !strcmp(Modifier, "call");
GlobalValue *GV = MO.getGlobal();
- std::string Name;
- bool isExt = GV->isDeclaration() || GV->isWeakForLinker();
- if (isExt && isCallOp && Subtarget->isTargetDarwin() &&
- TM.getRelocationModel() != Reloc::Static) {
- FnStubInfo &FnInfo = FnStubs[Mang->getMangledName(GV)];
- FnInfo.Init(GV, Mang);
- Name = FnInfo.Stub;
- } else {
- Name = Mang->getMangledName(GV);
- }
-
- O << Name;
+ O << Mang->getMangledName(GV);
printOffset(MO.getOffset());
@@ -394,14 +345,7 @@ void ARMAsmPrinter::printOperand(const MachineInstr *MI, int OpNum,
}
case MachineOperand::MO_ExternalSymbol: {
bool isCallOp = Modifier && !strcmp(Modifier, "call");
- std::string Name;
- if (isCallOp && Subtarget->isTargetDarwin() &&
- TM.getRelocationModel() != Reloc::Static) {
- FnStubInfo &FnInfo = FnStubs[Mang->makeNameProper(MO.getSymbolName())];
- FnInfo.Init(MO.getSymbolName(), Mang);
- Name = FnInfo.Stub;
- } else
- Name = Mang->makeNameProper(MO.getSymbolName());
+ std::string Name = Mang->makeNameProper(MO.getSymbolName());
O << Name;
if (isCallOp && Subtarget->isTargetELF() &&
@@ -1277,55 +1221,7 @@ bool ARMAsmPrinter::doFinalization(Module &M) {
static_cast<TargetLoweringObjectFileMachO &>(getObjFileLowering());
O << '\n';
-
- if (!FnStubs.empty()) {
- unsigned StubSize = 12;
- const char *StubSectionName = "__symbol_stub4";
-
- if (TM.getRelocationModel() == Reloc::PIC_) {
- StubSize = 16;
- StubSectionName = "__picsymbolstub4";
- }
-
- const MCSection *StubSection
- = TLOFMacho.getMachOSection("__TEXT", StubSectionName,
- MCSectionMachO::S_SYMBOL_STUBS,
- StubSize, SectionKind::getText());
- const MCSection *LazySymbolPointerSection
- = TLOFMacho.getLazySymbolPointerSection();
-
- // Output stubs for dynamically-linked functions
- for (StringMap<FnStubInfo>::iterator I = FnStubs.begin(),
- E = FnStubs.end(); I != E; ++I) {
- const FnStubInfo &Info = I->second;
-
- OutStreamer.SwitchSection(StubSection);
- EmitAlignment(2);
- O << "\t.code\t32\n";
-
- O << Info.Stub << ":\n";
- O << "\t.indirect_symbol " << I->getKeyData() << '\n';
- O << "\tldr ip, " << Info.SLP << '\n';
- if (TM.getRelocationModel() == Reloc::PIC_) {
- O << Info.SCV << ":\n";
- O << "\tadd ip, pc, ip\n";
- }
- O << "\tldr pc, [ip, #0]\n";
- O << Info.SLP << ":\n";
- O << "\t.long\t" << Info.LazyPtr;
- if (TM.getRelocationModel() == Reloc::PIC_)
- O << "-(" << Info.SCV << "+8)";
- O << '\n';
-
- OutStreamer.SwitchSection(LazySymbolPointerSection);
- O << Info.LazyPtr << ":\n";
- O << "\t.indirect_symbol " << I->getKeyData() << "\n";
- O << "\t.long\tdyld_stub_binding_helper\n";
- }
- O << '\n';
- }
-
// Output non-lazy-pointers for external and common global variables.
if (!GVNonLazyPtrs.empty()) {
// Switch with ".non_lazy_symbol_pointer" directive.
@@ -1349,7 +1245,6 @@ bool ARMAsmPrinter::doFinalization(Module &M) {
}
}
-
// Funny Darwin hack: This flag tells the linker that no global symbols
// contain code that falls through to other global symbols (e.g. the obvious
// implementation of multiple entry points). If this doesn't occur, the
diff --git a/test/CodeGen/ARM/stubs.ll b/test/CodeGen/ARM/stubs.ll
deleted file mode 100644
index baf6b7e63a17..000000000000
--- a/test/CodeGen/ARM/stubs.ll
+++ /dev/null
@@ -1,67 +0,0 @@
-; RUN: llvm-as < %s | llc -relocation-model=static | FileCheck %s -check-prefix=STATIC
-; RUN: llvm-as < %s | llc -relocation-model=pic | FileCheck %s -check-prefix=PIC
-; RUN: llvm-as < %s | llc -relocation-model=dynamic-no-pic | FileCheck %s -check-prefix=DYNAMIC
-; PR4482
-target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
-target triple = "armv6-apple-darwin2"
-
-define i32 @foo(i64 %x) nounwind {
-entry:
-; STATIC: _foo:
-; STATIC: bl _exact_log2
-; STATIC: ldmfd sp!, {r7, pc}
-; STATIC: .subsections_via_symbols
-
-; PIC: _foo:
-; PIC: bl L_exact_log2$stub
-; PIC: ldmfd sp!, {r7, pc}
-
-; DYNAMIC: _foo:
-; DYNAMIC: bl L_exact_log2$stub
-; DYNAMIC: ldmfd sp!, {r7, pc}
-
- %A = call i32 @exact_log2(i64 %x)
- ret i32 %A
-}
-
-define available_externally i32 @exact_log2(i64 %x) nounwind {
- ret i32 4
-}
-
-
-; PIC: .section __TEXT,__picsymbolstub4,symbol_stubs,none,16
-; PIC: L_exact_log2$stub:
-; PIC: .indirect_symbol _exact_log2
-; PIC: ldr ip, L_exact_log2$slp
-; PIC: L_exact_log2$scv:
-; PIC: add ip, pc, ip
-; PIC: ldr pc, [ip, #0]
-; PIC: L_exact_log2$slp:
-; PIC: .long L_exact_log2$lazy_ptr-(L_exact_log2$scv+8)
-
-; PIC: .section __DATA,__la_symbol_ptr,lazy_symbol_pointers
-; PIC: L_exact_log2$lazy_ptr:
-; PIC: .indirect_symbol _exact_log2
-; PIC: .long dyld_stub_binding_helper
-
-; PIC: .subsections_via_symbols
-
-
-; DYNAMIC: .section __TEXT,__symbol_stub4,symbol_stubs,none,12
-; DYNAMIC: L_exact_log2$stub:
-; DYNAMIC: .indirect_symbol _exact_log2
-; DYNAMIC: ldr ip, L_exact_log2$slp
-; DYNAMIC: ldr pc, [ip, #0]
-; DYNAMIC: L_exact_log2$slp:
-; DYNAMIC: .long L_exact_log2$lazy_ptr
-
-; DYNAMIC: .section __DATA,__la_symbol_ptr,lazy_symbol_pointers
-; DYNAMIC: L_exact_log2$lazy_ptr:
-; DYNAMIC: .indirect_symbol _exact_log2
-; DYNAMIC: .long dyld_stub_binding_helper
-; DYNAMIC: .subsections_via_symbols
-
-
-
-
-
diff --git a/test/CodeGen/Thumb2/thumb2-call.ll b/test/CodeGen/Thumb2/thumb2-call.ll
index b70c2a945324..5265ea6b5dd1 100644
--- a/test/CodeGen/Thumb2/thumb2-call.ll
+++ b/test/CodeGen/Thumb2/thumb2-call.ll
@@ -7,7 +7,7 @@ declare void @g(i32, i32, i32, i32)
define void @f() {
; DARWIN: f:
-; DARWIN: blx L_g$stub
+; DARWIN: blx _g
; LINUX: f:
; LINUX: bl g