Skip to content

Commit 845cc96

Browse files
authored
[clang][llvm][aarch64][win] Add a clang flag and module attribute for import call optimization, and remove LLVM flag (#122831)
Switches import call optimization from being enabled by an LLVM flag to instead using a module attribute, and creates a new Clang flag that will set that attribute. This addresses the concern raised in the original PR: <#121516 (comment)> This change also only creates the Called Global info if the module attribute is present, addressing this concern: <#122762 (review)>
1 parent 0e43b95 commit 845cc96

File tree

8 files changed

+63
-41
lines changed

8 files changed

+63
-41
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
@@ -7587,6 +7587,11 @@ def fexperimental_assignment_tracking_EQ : Joined<["-"], "fexperimental-assignme
75877587
def enable_tlsdesc : Flag<["-"], "enable-tlsdesc">,
75887588
MarshallingInfoFlag<CodeGenOpts<"EnableTLSDESC">>;
75897589

7590+
def import_call_optimization : Flag<["-"], "import-call-optimization">,
7591+
HelpText<"Emit Import Call sections on supported targets that can be used "
7592+
"by the Windows kernel to enable import call optimization">,
7593+
MarshallingInfoFlag<CodeGenOpts<"ImportCallOptimization">>;
7594+
75907595
} // let Visibility = [CC1Option]
75917596

75927597
//===----------------------------------------------------------------------===//

clang/lib/CodeGen/CodeGenModule.cpp

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

1296+
// Emit Import Call section.
1297+
if (CodeGenOpts.ImportCallOptimization)
1298+
getModule().addModuleFlag(llvm::Module::Warning, "import-call-optimization",
1299+
1);
1300+
12961301
// Indicate whether this Module was compiled with -fopenmp
12971302
if (getLangOpts().OpenMP && !getLangOpts().OpenMPSimd)
12981303
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: 5 additions & 7 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

@@ -344,6 +340,9 @@ void AArch64AsmPrinter::emitStartOfAsmFile(Module &M) {
344340
OutStreamer->emitSymbolAttribute(S, MCSA_Global);
345341
OutStreamer->emitAssignment(
346342
S, MCConstantExpr::create(Feat00Value, MMI->getContext()));
343+
344+
if (M.getModuleFlag("import-call-optimization"))
345+
EnableImportCallOptimization = true;
347346
}
348347

349348
if (!TT.isOSBinFormatELF())
@@ -3172,8 +3171,7 @@ void AArch64AsmPrinter::emitInstruction(const MachineInstr *MI) {
31723171

31733172
void AArch64AsmPrinter::recordIfImportCall(
31743173
const llvm::MachineInstr *BranchInst) {
3175-
if (!EnableImportCallOptimization ||
3176-
!TM.getTargetTriple().isOSBinFormatCOFF())
3174+
if (!EnableImportCallOptimization)
31773175
return;
31783176

31793177
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
@@ -9573,7 +9573,8 @@ AArch64TargetLowering::LowerCall(CallLoweringInfo &CLI,
95739573

95749574
DAG.addNoMergeSiteInfo(Ret.getNode(), CLI.NoMerge);
95759575
DAG.addCallSiteInfo(Ret.getNode(), std::move(CSInfo));
9576-
if (CalledGlobal)
9576+
if (CalledGlobal &&
9577+
MF.getFunction().getParent()->getModuleFlag("import-call-optimization"))
95779578
DAG.addCalledGlobal(Ret.getNode(), CalledGlobal, OpFlags);
95789579
return Ret;
95799580
}
@@ -9586,7 +9587,8 @@ AArch64TargetLowering::LowerCall(CallLoweringInfo &CLI,
95869587
DAG.addNoMergeSiteInfo(Chain.getNode(), CLI.NoMerge);
95879588
InGlue = Chain.getValue(1);
95889589
DAG.addCallSiteInfo(Chain.getNode(), std::move(CSInfo));
9589-
if (CalledGlobal)
9590+
if (CalledGlobal &&
9591+
MF.getFunction().getParent()->getModuleFlag("import-call-optimization"))
95909592
DAG.addCalledGlobal(Chain.getNode(), CalledGlobal, OpFlags);
95919593

95929594
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)