Skip to content

Commit 108e27d

Browse files
committed
[Clang][Driver][ARM] Forward -Os and -Oz as multilib flags
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 a676ecd commit 108e27d

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
@@ -255,6 +255,18 @@ static void getAArch64MultilibFlags(const Driver &D,
255255
Result.push_back(ABIArg->getAsString(Args));
256256
}
257257

258+
if (const Arg *A = Args.getLastArg(options::OPT_O_Group);
259+
A && A->getOption().matches(options::OPT_O)) {
260+
switch (A->getValue()[0]) {
261+
case 's':
262+
Result.push_back("-Os");
263+
break;
264+
case 'z':
265+
Result.push_back("-Oz");
266+
break;
267+
}
268+
}
269+
258270
processMultilibCustomFlags(Result, Args);
259271
}
260272

@@ -332,6 +344,19 @@ static void getARMMultilibFlags(const Driver &D, const llvm::Triple &Triple,
332344
if (Endian->getOption().matches(options::OPT_mbig_endian))
333345
Result.push_back(Endian->getAsString(Args));
334346
}
347+
348+
if (const Arg *A = Args.getLastArg(options::OPT_O_Group);
349+
A && A->getOption().matches(options::OPT_O)) {
350+
switch (A->getValue()[0]) {
351+
case 's':
352+
Result.push_back("-Os");
353+
break;
354+
case 'z':
355+
Result.push_back("-Oz");
356+
break;
357+
}
358+
}
359+
335360
processMultilibCustomFlags(Result, Args);
336361
}
337362

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)