@@ -18940,7 +18940,7 @@ SDValue X86TargetLowering::LowerJumpTable(SDValue Op, SelectionDAG &DAG) const {
1894018940
1894118941SDValue X86TargetLowering::LowerExternalSymbol(SDValue Op,
1894218942 SelectionDAG &DAG) const {
18943- return LowerGlobalOrExternal(Op, DAG, /*ForCall=*/false);
18943+ return LowerGlobalOrExternal(Op, DAG, /*ForCall=*/false, nullptr );
1894418944}
1894518945
1894618946SDValue
@@ -18968,7 +18968,8 @@ X86TargetLowering::LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const {
1896818968/// Creates target global address or external symbol nodes for calls or
1896918969/// other uses.
1897018970SDValue X86TargetLowering::LowerGlobalOrExternal(SDValue Op, SelectionDAG &DAG,
18971- bool ForCall) const {
18971+ bool ForCall,
18972+ bool *IsImpCall) const {
1897218973 // Unpack the global address or external symbol.
1897318974 SDLoc dl(Op);
1897418975 const GlobalValue *GV = nullptr;
@@ -19018,6 +19019,16 @@ SDValue X86TargetLowering::LowerGlobalOrExternal(SDValue Op, SelectionDAG &DAG,
1901819019 if (ForCall && !NeedsLoad && !HasPICReg && Offset == 0)
1901919020 return Result;
1902019021
19022+ // If Import Call Optimization is enabled and this is an imported function
19023+ // then make a note of it and return the global address without wrapping.
19024+ if (IsImpCall && (OpFlags == X86II::MO_DLLIMPORT) &&
19025+ Mod.getModuleFlag("import-call-optimization")) {
19026+ assert(ForCall && "Should only enable import call optimization if we are "
19027+ "lowering a call");
19028+ *IsImpCall = true;
19029+ return Result;
19030+ }
19031+
1902119032 Result = DAG.getNode(getGlobalWrapperKind(GV, OpFlags), dl, PtrVT, Result);
1902219033
1902319034 // With PIC, the address is actually $g + Offset.
@@ -19043,7 +19054,7 @@ SDValue X86TargetLowering::LowerGlobalOrExternal(SDValue Op, SelectionDAG &DAG,
1904319054
1904419055SDValue
1904519056X86TargetLowering::LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const {
19046- return LowerGlobalOrExternal(Op, DAG, /*ForCall=*/false);
19057+ return LowerGlobalOrExternal(Op, DAG, /*ForCall=*/false, nullptr );
1904719058}
1904819059
1904919060static SDValue GetTLSADDR(SelectionDAG &DAG, GlobalAddressSDNode *GA,
@@ -34582,6 +34593,7 @@ const char *X86TargetLowering::getTargetNodeName(unsigned Opcode) const {
3458234593 NODE_NAME_CASE(FST)
3458334594 NODE_NAME_CASE(CALL)
3458434595 NODE_NAME_CASE(CALL_RVMARKER)
34596+ NODE_NAME_CASE(IMP_CALL)
3458534597 NODE_NAME_CASE(BT)
3458634598 NODE_NAME_CASE(CMP)
3458734599 NODE_NAME_CASE(FCMP)
@@ -60992,6 +61004,7 @@ X86TargetLowering::EmitKCFICheck(MachineBasicBlock &MBB,
6099261004 Register TargetReg;
6099361005 switch (MBBI->getOpcode()) {
6099461006 case X86::CALL64r:
61007+ case X86::CALL64r_ImpCall:
6099561008 case X86::CALL64r_NT:
6099661009 case X86::TAILJMPr64:
6099761010 case X86::TAILJMPr64_REX:
0 commit comments