@@ -19179,7 +19179,7 @@ SDValue X86TargetLowering::LowerJumpTable(SDValue Op, SelectionDAG &DAG) const {
1917919179
1918019180SDValue X86TargetLowering::LowerExternalSymbol(SDValue Op,
1918119181 SelectionDAG &DAG) const {
19182- return LowerGlobalOrExternal(Op, DAG, /*ForCall=*/false);
19182+ return LowerGlobalOrExternal(Op, DAG, /*ForCall=*/false, nullptr );
1918319183}
1918419184
1918519185SDValue
@@ -19207,7 +19207,8 @@ X86TargetLowering::LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const {
1920719207/// Creates target global address or external symbol nodes for calls or
1920819208/// other uses.
1920919209SDValue X86TargetLowering::LowerGlobalOrExternal(SDValue Op, SelectionDAG &DAG,
19210- bool ForCall) const {
19210+ bool ForCall,
19211+ bool *IsImpCall) const {
1921119212 // Unpack the global address or external symbol.
1921219213 SDLoc dl(Op);
1921319214 const GlobalValue *GV = nullptr;
@@ -19257,6 +19258,16 @@ SDValue X86TargetLowering::LowerGlobalOrExternal(SDValue Op, SelectionDAG &DAG,
1925719258 if (ForCall && !NeedsLoad && !HasPICReg && Offset == 0)
1925819259 return Result;
1925919260
19261+ // If Import Call Optimization is enabled and this is an imported function
19262+ // then make a note of it and return the global address without wrapping.
19263+ if (IsImpCall && (OpFlags == X86II::MO_DLLIMPORT) &&
19264+ Mod.getModuleFlag("import-call-optimization")) {
19265+ assert(ForCall && "Should only enable import call optimization if we are "
19266+ "lowering a call");
19267+ *IsImpCall = true;
19268+ return Result;
19269+ }
19270+
1926019271 Result = DAG.getNode(getGlobalWrapperKind(GV, OpFlags), dl, PtrVT, Result);
1926119272
1926219273 // With PIC, the address is actually $g + Offset.
@@ -19282,7 +19293,7 @@ SDValue X86TargetLowering::LowerGlobalOrExternal(SDValue Op, SelectionDAG &DAG,
1928219293
1928319294SDValue
1928419295X86TargetLowering::LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const {
19285- return LowerGlobalOrExternal(Op, DAG, /*ForCall=*/false);
19296+ return LowerGlobalOrExternal(Op, DAG, /*ForCall=*/false, nullptr );
1928619297}
1928719298
1928819299static SDValue GetTLSADDR(SelectionDAG &DAG, GlobalAddressSDNode *GA,
@@ -34821,6 +34832,7 @@ const char *X86TargetLowering::getTargetNodeName(unsigned Opcode) const {
3482134832 NODE_NAME_CASE(FST)
3482234833 NODE_NAME_CASE(CALL)
3482334834 NODE_NAME_CASE(CALL_RVMARKER)
34835+ NODE_NAME_CASE(IMP_CALL)
3482434836 NODE_NAME_CASE(BT)
3482534837 NODE_NAME_CASE(CMP)
3482634838 NODE_NAME_CASE(FCMP)
@@ -62092,6 +62104,7 @@ X86TargetLowering::EmitKCFICheck(MachineBasicBlock &MBB,
6209262104 Register TargetReg;
6209362105 switch (MBBI->getOpcode()) {
6209462106 case X86::CALL64r:
62107+ case X86::CALL64r_ImpCall:
6209562108 case X86::CALL64r_NT:
6209662109 case X86::TAILJMPr64:
6209762110 case X86::TAILJMPr64_REX:
0 commit comments