Skip to content

Commit c9793e1

Browse files
committed
[aarch64][win] Add a clang flag and module attribute for import call optimization, and remove LLVM flag
1 parent cd264f0 commit c9793e1

File tree

8 files changed

+64
-42
lines changed

8 files changed

+64
-42
lines changed

clang/include/clang/Basic/CodeGenOptions.def

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,10 @@ ENUM_CODEGENOPT(ZeroCallUsedRegs, llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind,
465465
/// non-deleting destructors. (No effect on Microsoft ABI.)
466466
CODEGENOPT(CtorDtorReturnThis, 1, 0)
467467

468+
/// Enables emitting Import Call sections on supported targets that can be used
469+
/// by the Windows kernel to enable import call optimization.
470+
CODEGENOPT(ImportCallOptimization, 1, 0)
471+
468472
/// FIXME: Make DebugOptions its own top-level .def file.
469473
#include "DebugOptions.def"
470474

clang/include/clang/Driver/Options.td

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7657,6 +7657,11 @@ def fexperimental_assignment_tracking_EQ : Joined<["-"], "fexperimental-assignme
76577657
def enable_tlsdesc : Flag<["-"], "enable-tlsdesc">,
76587658
MarshallingInfoFlag<CodeGenOpts<"EnableTLSDESC">>;
76597659

7660+
def import_call_optimization : Flag<["-"], "import-call-optimization">,
7661+
HelpText<"Emit Import Call sections on supported targets that can be used "
7662+
"by the Windows kernel to enable import call optimization">,
7663+
MarshallingInfoFlag<CodeGenOpts<"ImportCallOptimization">>;
7664+
76607665
} // let Visibility = [CC1Option]
76617666

76627667
//===----------------------------------------------------------------------===//

clang/lib/CodeGen/CodeGenModule.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1291,6 +1291,11 @@ void CodeGenModule::Release() {
12911291
if (LangOpts.EHAsynch)
12921292
getModule().addModuleFlag(llvm::Module::Warning, "eh-asynch", 1);
12931293

1294+
// Emit Import Call section.
1295+
if (CodeGenOpts.ImportCallOptimization)
1296+
getModule().addModuleFlag(llvm::Module::Warning, "import-call-optimization",
1297+
1);
1298+
12941299
// Indicate whether this Module was compiled with -fopenmp
12951300
if (getLangOpts().OpenMP && !getLangOpts().OpenMPSimd)
12961301
getModule().addModuleFlag(llvm::Module::Max, "openmp", LangOpts.OpenMP);
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
// RUN: %clang_cc1 -import-call-optimization -emit-llvm %s -o - | FileCheck %s
2+
3+
void f(void) {}
4+
5+
// CHECK: !"import-call-optimization", i32 1}

llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,6 @@ static cl::opt<PtrauthCheckMode> PtrauthAuthChecks(
7878
cl::desc("Check pointer authentication auth/resign failures"),
7979
cl::init(Default));
8080

81-
static cl::opt<bool> EnableImportCallOptimization(
82-
"aarch64-win-import-call-optimization", cl::Hidden,
83-
cl::desc("Enable import call optimization for AArch64 Windows"),
84-
cl::init(false));
85-
8681
#define DEBUG_TYPE "asm-printer"
8782

8883
namespace {
@@ -95,6 +90,7 @@ class AArch64AsmPrinter : public AsmPrinter {
9590
#ifndef NDEBUG
9691
unsigned InstsEmitted;
9792
#endif
93+
bool EnableImportCallOptimization = false;
9894
DenseMap<MCSection *, std::vector<std::pair<MCSymbol *, MCSymbol *>>>
9995
SectionToImportedFunctionCalls;
10096

@@ -340,6 +336,9 @@ void AArch64AsmPrinter::emitStartOfAsmFile(Module &M) {
340336
OutStreamer->emitSymbolAttribute(S, MCSA_Global);
341337
OutStreamer->emitAssignment(
342338
S, MCConstantExpr::create(Feat00Value, MMI->getContext()));
339+
340+
if (M.getModuleFlag("import-call-optimization"))
341+
EnableImportCallOptimization = true;
343342
}
344343

345344
if (!TT.isOSBinFormatELF())
@@ -945,7 +944,7 @@ void AArch64AsmPrinter::emitEndOfAsmFile(Module &M) {
945944

946945
// If import call optimization is enabled, emit the appropriate section.
947946
// We do this whether or not we recorded any import calls.
948-
if (EnableImportCallOptimization && TT.isOSBinFormatCOFF()) {
947+
if (EnableImportCallOptimization) {
949948
OutStreamer->switchSection(getObjFileLowering().getImportCallSection());
950949

951950
// Section always starts with some magic.
@@ -3109,8 +3108,7 @@ void AArch64AsmPrinter::emitInstruction(const MachineInstr *MI) {
31093108

31103109
void AArch64AsmPrinter::recordIfImportCall(
31113110
const llvm::MachineInstr *BranchInst) {
3112-
if (!EnableImportCallOptimization ||
3113-
!TM.getTargetTriple().isOSBinFormatCOFF())
3111+
if (!EnableImportCallOptimization)
31143112
return;
31153113

31163114
auto [GV, OpFlags] = BranchInst->getMF()->tryGetCalledGlobal(BranchInst);

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9577,7 +9577,8 @@ AArch64TargetLowering::LowerCall(CallLoweringInfo &CLI,
95779577

95789578
DAG.addNoMergeSiteInfo(Ret.getNode(), CLI.NoMerge);
95799579
DAG.addCallSiteInfo(Ret.getNode(), std::move(CSInfo));
9580-
if (CalledGlobal)
9580+
if (CalledGlobal &&
9581+
MF.getFunction().getParent()->getModuleFlag("import-call-optimization"))
95819582
DAG.addCalledGlobal(Ret.getNode(), CalledGlobal, OpFlags);
95829583
return Ret;
95839584
}
@@ -9590,7 +9591,8 @@ AArch64TargetLowering::LowerCall(CallLoweringInfo &CLI,
95909591
DAG.addNoMergeSiteInfo(Chain.getNode(), CLI.NoMerge);
95919592
InGlue = Chain.getValue(1);
95929593
DAG.addCallSiteInfo(Chain.getNode(), std::move(CSInfo));
9593-
if (CalledGlobal)
9594+
if (CalledGlobal &&
9595+
MF.getFunction().getParent()->getModuleFlag("import-call-optimization"))
95949596
DAG.addCalledGlobal(Chain.getNode(), CalledGlobal, OpFlags);
95959597

95969598
uint64_t CalleePopBytes =

llvm/test/CodeGen/AArch64/win-import-call-optimization-nocalls.ll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
; RUN: llc -mtriple=aarch64-pc-windows-msvc -aarch64-win-import-call-optimization < %s | FileCheck %s
1+
; RUN: llc -mtriple=aarch64-pc-windows-msvc < %s | FileCheck %s
22

33
define dso_local void @normal_call() local_unnamed_addr {
44
entry:
@@ -16,3 +16,6 @@ declare void @a() local_unnamed_addr
1616
; CHECK-LABEL .section .impcall,"yi"
1717
; CHECK-NEXT .asciz "Imp_Call_V1"
1818
; CHECK-NOT .secnum
19+
20+
!llvm.module.flags = !{!0}
21+
!0 = !{i32 1, !"import-call-optimization", i32 1}
Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,48 @@
1-
; RUN: llc -mtriple=aarch64-pc-windows-msvc -aarch64-win-import-call-optimization < %s | FileCheck %s --check-prefix=CHECK-ENABLED
2-
; RUN: llc -mtriple=aarch64-pc-windows-msvc < %s | FileCheck %s --check-prefix=CHECK-DISABLED
3-
4-
; CHECK-DISABLED-NOT: .section .impcall
1+
; RUN: llc -mtriple=aarch64-pc-windows-msvc < %s | FileCheck %s --check-prefix=CHECK
52

63
define dso_local void @normal_call() local_unnamed_addr section "nc_sect" {
74
entry:
85
call void @a()
96
call void @a()
107
ret void
118
}
12-
; CHECK-ENABLED-LABEL: normal_call:
13-
; CHECK-ENABLED: adrp [[ADRPREG:x[0-9]+]], __imp_a
14-
; CHECK-ENABLED-NEXT: ldr [[LDRREG:x[0-9]+]], [[[ADRPREG]], :lo12:__imp_a]
15-
; CHECK-ENABLED-NEXT: .Limpcall0:
16-
; CHECK-ENABLED-NEXT: blr [[LDRREG]]
17-
; CHECK-ENABLED-NEXT: .Limpcall1:
18-
; CHECK-ENABLED-NEXT: blr [[LDRREG]]
9+
; CHECK-LABEL: normal_call:
10+
; CHECK: adrp [[ADRPREG:x[0-9]+]], __imp_a
11+
; CHECK-NEXT: ldr [[LDRREG:x[0-9]+]], [[[ADRPREG]], :lo12:__imp_a]
12+
; CHECK-NEXT: .Limpcall0:
13+
; CHECK-NEXT: blr [[LDRREG]]
14+
; CHECK-NEXT: .Limpcall1:
15+
; CHECK-NEXT: blr [[LDRREG]]
1916

2017
define dso_local void @tail_call() local_unnamed_addr section "tc_sect" {
2118
entry:
2219
tail call void @b()
2320
ret void
2421
}
25-
; CHECK-ENABLED-LABEL: tail_call:
26-
; CHECK-ENABLED: adrp [[ADRPREG:x[0-9]+]], __imp_b
27-
; CHECK-ENABLED-NEXT: ldr [[LDRREG:x[0-9]+]], [[[ADRPREG]], :lo12:__imp_b]
28-
; CHECK-ENABLED-NEXT: .Limpcall2:
29-
; CHECK-ENABLED-NEXT: br [[LDRREG]]
22+
; CHECK-LABEL: tail_call:
23+
; CHECK: adrp [[ADRPREG:x[0-9]+]], __imp_b
24+
; CHECK-NEXT: ldr [[LDRREG:x[0-9]+]], [[[ADRPREG]], :lo12:__imp_b]
25+
; CHECK-NEXT: .Limpcall2:
26+
; CHECK-NEXT: br [[LDRREG]]
3027

3128
declare dllimport void @a() local_unnamed_addr
3229
declare dllimport void @b() local_unnamed_addr
3330

34-
; CHECK-ENABLED-LABEL .section .impcall,"yi"
35-
; CHECK-ENABLED-NEXT .asciz "Imp_Call_V1"
36-
; CHECK-ENABLED-NEXT .word 32
37-
; CHECK-ENABLED-NEXT .secnum nc_sect
38-
; CHECK-ENABLED-NEXT .word 19
39-
; CHECK-ENABLED-NEXT .secoffset .Limpcall0
40-
; CHECK-ENABLED-NEXT .symidx __imp_a
41-
; CHECK-ENABLED-NEXT .word 19
42-
; CHECK-ENABLED-NEXT .secoffset .Limpcall1
43-
; CHECK-ENABLED-NEXT .symidx __imp_a
44-
; CHECK-ENABLED-NEXT .word 20
45-
; CHECK-ENABLED-NEXT .secnum tc_sect
46-
; CHECK-ENABLED-NEXT .word 19
47-
; CHECK-ENABLED-NEXT .secoffset .Limpcall2
48-
; CHECK-ENABLED-NEXT .symidx __imp_b
31+
; CHECK-LABEL .section .impcall,"yi"
32+
; CHECK-NEXT .asciz "Imp_Call_V1"
33+
; CHECK-NEXT .word 32
34+
; CHECK-NEXT .secnum nc_sect
35+
; CHECK-NEXT .word 19
36+
; CHECK-NEXT .secoffset .Limpcall0
37+
; CHECK-NEXT .symidx __imp_a
38+
; CHECK-NEXT .word 19
39+
; CHECK-NEXT .secoffset .Limpcall1
40+
; CHECK-NEXT .symidx __imp_a
41+
; CHECK-NEXT .word 20
42+
; CHECK-NEXT .secnum tc_sect
43+
; CHECK-NEXT .word 19
44+
; CHECK-NEXT .secoffset .Limpcall2
45+
; CHECK-NEXT .symidx __imp_b
46+
47+
!llvm.module.flags = !{!0}
48+
!0 = !{i32 1, !"import-call-optimization", i32 1}

0 commit comments

Comments
 (0)