Index: llvm/trunk/include/llvm/MC/MCSymbolXCOFF.h =================================================================== --- llvm/trunk/include/llvm/MC/MCSymbolXCOFF.h +++ llvm/trunk/include/llvm/MC/MCSymbolXCOFF.h @@ -13,21 +13,11 @@ namespace llvm { -class GlobalValue; - class MCSymbolXCOFF : public MCSymbol { - // The IR symbol this MCSymbolXCOFF is based on. It is set on function - // entry point symbols when they are the callee operand of a direct call - // SDNode. - const GlobalValue *GV = nullptr; - public: MCSymbolXCOFF(const StringMapEntry *Name, bool isTemporary) : MCSymbol(SymbolKindXCOFF, Name, isTemporary) {} - void setGlobalValue(const GlobalValue *G) { GV = G; } - const GlobalValue *getGlobalValue() const { return GV; } - static bool classof(const MCSymbol *S) { return S->isXCOFF(); } }; Index: llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp =================================================================== --- llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp +++ llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp @@ -4432,25 +4432,15 @@ static bool callsShareTOCBase(const Function *Caller, SDValue Callee, const TargetMachine &TM) { - // Need a GlobalValue to determine if a Caller and Callee share the same - // TOCBase. - const GlobalValue *GV = nullptr; - - if (GlobalAddressSDNode *G = dyn_cast(Callee)) { - GV = G->getGlobal(); - } else if (MCSymbolSDNode *M = dyn_cast(Callee)) { - // On AIX only, we replace GlobalAddressSDNode with MCSymbolSDNode for - // the callee of a direct function call. The MCSymbolSDNode contains the - // MCSymbol for the funtion entry point. - const auto *S = cast(M->getMCSymbol()); - GV = S->getGlobalValue(); - } - - // If we failed to get a GlobalValue, then pessimistically assume they do not - // share a TOCBase. - if (!GV) - return false; + // Callee is either a GlobalAddress or an ExternalSymbol. ExternalSymbols + // don't have enough information to determine if the caller and calle share + // the same TOC base, so we have to pessimistically assume they don't for + // correctness. + GlobalAddressSDNode *G = dyn_cast(Callee); + if (!G) + return false; + const GlobalValue *GV = G->getGlobal(); // The medium and large code models are expected to provide a sufficiently // large TOC to provide all data addressing needs of a module with a // single TOC. Since each module will be addressed with a single TOC then we @@ -4934,39 +4924,27 @@ // we're building with the leopard linker or later, which automatically // synthesizes these stubs. const TargetMachine &TM = DAG.getTarget(); - MachineFunction &MF = DAG.getMachineFunction(); - const Module *Mod = MF.getFunction().getParent(); + const Module *Mod = DAG.getMachineFunction().getFunction().getParent(); const GlobalValue *GV = nullptr; if (auto *G = dyn_cast(Callee)) GV = G->getGlobal(); bool Local = TM.shouldAssumeDSOLocal(*Mod, GV); bool UsePlt = !Local && Subtarget.isTargetELF() && !isPPC64; + // If the callee is a GlobalAddress/ExternalSymbol node (quite common, + // every direct call is) turn it into a TargetGlobalAddress / + // TargetExternalSymbol node so that legalize doesn't hack it. if (isFunctionGlobalAddress(Callee)) { GlobalAddressSDNode *G = cast(Callee); - if (TM.getTargetTriple().isOSAIX()) { - // Direct function calls reference the symbol for the function's entry - // point, which is named by inserting a "." before the function's - // C-linkage name. - auto &Context = MF.getMMI().getContext(); - MCSymbol *S = Context.getOrCreateSymbol(Twine(".") + - Twine(G->getGlobal()->getName())); - cast(S)->setGlobalValue(GV); - Callee = DAG.getMCSymbol(S, PtrVT); - } else { - // A call to a TLS address is actually an indirect call to a - // thread-specific pointer. - unsigned OpFlags = 0; - if (UsePlt) - OpFlags = PPCII::MO_PLT; - - // If the callee is a GlobalAddress/ExternalSymbol node (quite common, - // every direct call is) turn it into a TargetGlobalAddress / - // TargetExternalSymbol node so that legalize doesn't hack it. - Callee = DAG.getTargetGlobalAddress(G->getGlobal(), dl, - Callee.getValueType(), 0, OpFlags); - } + // A call to a TLS address is actually an indirect call to a + // thread-specific pointer. + unsigned OpFlags = 0; + if (UsePlt) + OpFlags = PPCII::MO_PLT; + + Callee = DAG.getTargetGlobalAddress(G->getGlobal(), dl, + Callee.getValueType(), 0, OpFlags); needIndirectCall = false; } @@ -5245,6 +5223,7 @@ // same TOC), the NOP will remain unchanged, or become some other NOP. MachineFunction &MF = DAG.getMachineFunction(); + EVT PtrVT = getPointerTy(DAG.getDataLayout()); if (!isTailCall && !isPatchPoint && ((Subtarget.isSVR4ABI() && Subtarget.isPPC64()) || Subtarget.isAIXABI())) { @@ -5263,7 +5242,6 @@ // allocated and an unnecessary move instruction being generated. CallOpc = PPCISD::BCTRL_LOAD_TOC; - EVT PtrVT = getPointerTy(DAG.getDataLayout()); SDValue StackPtr = DAG.getRegister(PPC::X1, PtrVT); unsigned TOCSaveOffset = Subtarget.getFrameLowering()->getTOCSaveOffset(); SDValue TOCOff = DAG.getIntPtrConstant(TOCSaveOffset, dl); @@ -5279,6 +5257,19 @@ } } + if (Subtarget.isAIXABI() && isFunctionGlobalAddress(Callee)) { + // On AIX, direct function calls reference the symbol for the function's + // entry point, which is named by inserting a "." before the function's + // C-linkage name. + GlobalAddressSDNode *G = cast(Callee); + auto &Context = DAG.getMachineFunction().getMMI().getContext(); + MCSymbol *S = Context.getOrCreateSymbol(Twine(".") + + Twine(G->getGlobal()->getName())); + Callee = DAG.getMCSymbol(S, PtrVT); + // Replace the GlobalAddressSDNode Callee with the MCSymbolSDNode. + Ops[1] = Callee; + } + Chain = DAG.getNode(CallOpc, dl, NodeTys, Ops); InFlag = Chain.getValue(1);