Skip to content

Commit 579a807

Browse files
authored
[Clang][Driver][ARM] Forward -Os and -Oz as multilib flags (#149819)
Pass along `-Os` and `-Oz` as multilib flags under ARM and AArch64 so that they can be used as criteria for multilib selection.
1 parent b487f9a commit 579a807

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

clang/lib/Driver/ToolChain.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,18 @@ static void getAArch64MultilibFlags(const Driver &D,
217217
Result.push_back(ABIArg->getAsString(Args));
218218
}
219219

220+
if (const Arg *A = Args.getLastArg(options::OPT_O_Group);
221+
A && A->getOption().matches(options::OPT_O)) {
222+
switch (A->getValue()[0]) {
223+
case 's':
224+
Result.push_back("-Os");
225+
break;
226+
case 'z':
227+
Result.push_back("-Oz");
228+
break;
229+
}
230+
}
231+
220232
processMultilibCustomFlags(Result, Args);
221233
}
222234

@@ -294,6 +306,19 @@ static void getARMMultilibFlags(const Driver &D, const llvm::Triple &Triple,
294306
if (Endian->getOption().matches(options::OPT_mbig_endian))
295307
Result.push_back(Endian->getAsString(Args));
296308
}
309+
310+
if (const Arg *A = Args.getLastArg(options::OPT_O_Group);
311+
A && A->getOption().matches(options::OPT_O)) {
312+
switch (A->getValue()[0]) {
313+
case 's':
314+
Result.push_back("-Os");
315+
break;
316+
case 'z':
317+
Result.push_back("-Oz");
318+
break;
319+
}
320+
}
321+
297322
processMultilibCustomFlags(Result, Args);
298323
}
299324

clang/test/Driver/print-multi-selection-flags.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,3 +126,20 @@
126126
// CHECK-PIE1: -fpie
127127
// CHECK-ROPI: -fropi
128128
// CHECK-RWPI: -frwpi
129+
130+
// RUN: %clang -multi-lib-config=%S/Inputs/multilib/empty.yaml -print-multi-flags-experimental --target=arm-none-eabi -march=armv7a -Os | FileCheck --check-prefix=CHECK-OPT-OS %s
131+
// RUN: %clang -multi-lib-config=%S/Inputs/multilib/empty.yaml -print-multi-flags-experimental --target=arm-none-eabi -march=armv7a -Oz | FileCheck --check-prefix=CHECK-OPT-OZ %s
132+
// RUN: %clang -multi-lib-config=%S/Inputs/multilib/empty.yaml -print-multi-flags-experimental --target=arm-none-eabi -march=armv7a | FileCheck --check-prefix=CHECK-OPT %s
133+
// RUN: %clang -multi-lib-config=%S/Inputs/multilib/empty.yaml -print-multi-flags-experimental --target=arm-none-eabi -march=armv7a -O1 | FileCheck --check-prefix=CHECK-OPT %s
134+
// RUN: %clang -multi-lib-config=%S/Inputs/multilib/empty.yaml -print-multi-flags-experimental --target=arm-none-eabi -march=armv7a -O2 | FileCheck --check-prefix=CHECK-OPT %s
135+
// RUN: %clang -multi-lib-config=%S/Inputs/multilib/empty.yaml -print-multi-flags-experimental --target=arm-none-eabi -march=armv7a -O3 | FileCheck --check-prefix=CHECK-OPT %s
136+
// RUN: %clang -multi-lib-config=%S/Inputs/multilib/empty.yaml -print-multi-flags-experimental --target=aarch64-none-eabi -Os | FileCheck --check-prefix=CHECK-OPT-OS %s
137+
// RUN: %clang -multi-lib-config=%S/Inputs/multilib/empty.yaml -print-multi-flags-experimental --target=aarch64-none-eabi -Oz | FileCheck --check-prefix=CHECK-OPT-OZ %s
138+
// RUN: %clang -multi-lib-config=%S/Inputs/multilib/empty.yaml -print-multi-flags-experimental --target=aarch64-none-eabi | FileCheck --check-prefix=CHECK-OPT %s
139+
// RUN: %clang -multi-lib-config=%S/Inputs/multilib/empty.yaml -print-multi-flags-experimental --target=aarch64-none-eabi -O1 | FileCheck --check-prefix=CHECK-OPT %s
140+
// RUN: %clang -multi-lib-config=%S/Inputs/multilib/empty.yaml -print-multi-flags-experimental --target=aarch64-none-eabi -O2 | FileCheck --check-prefix=CHECK-OPT %s
141+
// RUN: %clang -multi-lib-config=%S/Inputs/multilib/empty.yaml -print-multi-flags-experimental --target=aarch64-none-eabi -O3 | FileCheck --check-prefix=CHECK-OPT %s
142+
// CHECK-OPT-OZ: -Oz
143+
// CHECK-OPT-OS: -Os
144+
// CHECK-OPT-NOT: -Oz
145+
// CHECK-OPT-NOT: -Os

0 commit comments

Comments
 (0)