Skip to content

Commit aa46b7b

Browse files
committed
Repurpose DriverArgs to MacroDefines
1 parent 403ee8c commit aa46b7b

File tree

7 files changed

+118
-113
lines changed

7 files changed

+118
-113
lines changed

clang/include/clang/Driver/Multilib.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,10 +169,10 @@ class MultilibSet {
169169
const_iterator end() const { return Multilibs.end(); }
170170

171171
/// Process custom flags from \p Flags and returns an expanded flags list and
172-
/// a list of extra compilation arguments.
172+
/// a list of macro defines.
173173
/// Returns a pair where:
174174
/// - first: the new flags list including custom flags after processing.
175-
/// - second: the extra compilation arguments to be fed to the driver.
175+
/// - second: the extra macro defines to be fed to the driver.
176176
std::pair<Multilib::flags_list, SmallVector<StringRef>>
177177
processCustomFlags(const Driver &D, const Multilib::flags_list &Flags) const;
178178

clang/include/clang/Driver/ToolChain.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -686,10 +686,10 @@ class ToolChain {
686686
/// Add warning options that need to be passed to cc1 for this target.
687687
virtual void addClangWarningOptions(llvm::opt::ArgStringList &CC1Args) const;
688688

689-
// Get the list of extra driver arguments strings requested by the multilib
689+
// Get the list of extra macro defines requested by the multilib
690690
// configuration.
691691
virtual SmallVector<std::string>
692-
getMultilibDriverArgsStr(llvm::opt::ArgList &Args) const {
692+
getMultilibMacroDefinesStr(llvm::opt::ArgList &Args) const {
693693
return {};
694694
};
695695

clang/lib/Driver/Driver.cpp

Lines changed: 81 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1398,9 +1398,7 @@ Compilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) {
13981398
bool HasConfigFileTail = !ContainsError && CfgOptionsTail;
13991399

14001400
// All arguments, from both config file and command line.
1401-
auto UArgs = std::make_unique<InputArgList>(
1402-
HasConfigFileHead ? std::move(*CfgOptionsHead) : std::move(*CLOptions));
1403-
InputArgList &Args = *UArgs;
1401+
InputArgList Args = HasConfigFileHead ? std::move(*CfgOptionsHead) : std::move(*CLOptions);
14041402

14051403
if (HasConfigFileHead)
14061404
for (auto *Opt : *CLOptions)
@@ -1428,6 +1426,52 @@ Compilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) {
14281426
}
14291427
}
14301428

1429+
// Check for working directory option before accessing any files
1430+
if (Arg *WD = Args.getLastArg(options::OPT_working_directory))
1431+
if (VFS->setCurrentWorkingDirectory(WD->getValue()))
1432+
Diag(diag::err_drv_unable_to_set_working_directory) << WD->getValue();
1433+
1434+
// Check for missing include directories.
1435+
if (!Diags.isIgnored(diag::warn_missing_include_dirs, SourceLocation())) {
1436+
for (auto IncludeDir : Args.getAllArgValues(options::OPT_I_Group)) {
1437+
if (!VFS->exists(IncludeDir))
1438+
Diag(diag::warn_missing_include_dirs) << IncludeDir;
1439+
}
1440+
}
1441+
1442+
// FIXME: This stuff needs to go into the Compilation, not the driver.
1443+
bool CCCPrintPhases;
1444+
1445+
// -canonical-prefixes, -no-canonical-prefixes are used very early in main.
1446+
Args.ClaimAllArgs(options::OPT_canonical_prefixes);
1447+
Args.ClaimAllArgs(options::OPT_no_canonical_prefixes);
1448+
1449+
// f(no-)integated-cc1 is also used very early in main.
1450+
Args.ClaimAllArgs(options::OPT_fintegrated_cc1);
1451+
Args.ClaimAllArgs(options::OPT_fno_integrated_cc1);
1452+
1453+
// Ignore -pipe.
1454+
Args.ClaimAllArgs(options::OPT_pipe);
1455+
1456+
// Extract -ccc args.
1457+
//
1458+
// FIXME: We need to figure out where this behavior should live. Most of it
1459+
// should be outside in the client; the parts that aren't should have proper
1460+
// options, either by introducing new ones or by overloading gcc ones like -V
1461+
// or -b.
1462+
CCCPrintPhases = Args.hasArg(options::OPT_ccc_print_phases);
1463+
CCCPrintBindings = Args.hasArg(options::OPT_ccc_print_bindings);
1464+
if (const Arg *A = Args.getLastArg(options::OPT_ccc_gcc_name))
1465+
CCCGenericGCCName = A->getValue();
1466+
1467+
// Process -fproc-stat-report options.
1468+
if (const Arg *A = Args.getLastArg(options::OPT_fproc_stat_report_EQ)) {
1469+
CCPrintProcessStats = true;
1470+
CCPrintStatReportFilename = A->getValue();
1471+
}
1472+
if (Args.hasArg(options::OPT_fproc_stat_report))
1473+
CCPrintProcessStats = true;
1474+
14311475
// FIXME: TargetTriple is used by the target-prefixed calls to as/ld
14321476
// and getToolChain is const.
14331477
if (IsCLMode()) {
@@ -1485,79 +1529,6 @@ Compilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) {
14851529
TargetTriple = A->getValue();
14861530
if (const Arg *A = Args.getLastArg(options::OPT_ccc_install_dir))
14871531
Dir = Dir = A->getValue();
1488-
if (const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ))
1489-
SysRoot = A->getValue();
1490-
if (const Arg *A = Args.getLastArg(options::OPT_resource_dir))
1491-
ResourceDir = A->getValue();
1492-
if (const Arg *A = Args.getLastArg(options::OPT__dyld_prefix_EQ))
1493-
DyldPrefix = A->getValue();
1494-
1495-
setLTOMode(Args);
1496-
1497-
// Owned by the host.
1498-
const ToolChain &TC =
1499-
getToolChain(Args, computeTargetTriple(*this, TargetTriple, Args));
1500-
1501-
SmallVector<std::string> MultilibDriverArgsStr =
1502-
TC.getMultilibDriverArgsStr(Args);
1503-
SmallVector<const char *> MLArgsChar(
1504-
llvm::map_range(MultilibDriverArgsStr, [&Args](const auto &S) {
1505-
return Args.MakeArgString(S);
1506-
}));
1507-
bool MLContainsError;
1508-
auto MultilibDriverArgList = std::make_unique<InputArgList>(
1509-
ParseArgStrings(MLArgsChar, /*UseDriverMode=*/false, MLContainsError));
1510-
if (!MLContainsError)
1511-
for (auto *Opt : *MultilibDriverArgList) {
1512-
appendOneArg(Args, Opt, nullptr);
1513-
}
1514-
1515-
// Check for working directory option before accessing any files
1516-
if (Arg *WD = Args.getLastArg(options::OPT_working_directory))
1517-
if (VFS->setCurrentWorkingDirectory(WD->getValue()))
1518-
Diag(diag::err_drv_unable_to_set_working_directory) << WD->getValue();
1519-
1520-
// Check for missing include directories.
1521-
if (!Diags.isIgnored(diag::warn_missing_include_dirs, SourceLocation())) {
1522-
for (auto IncludeDir : Args.getAllArgValues(options::OPT_I_Group)) {
1523-
if (!VFS->exists(IncludeDir))
1524-
Diag(diag::warn_missing_include_dirs) << IncludeDir;
1525-
}
1526-
}
1527-
1528-
// FIXME: This stuff needs to go into the Compilation, not the driver.
1529-
bool CCCPrintPhases;
1530-
1531-
// -canonical-prefixes, -no-canonical-prefixes are used very early in main.
1532-
Args.ClaimAllArgs(options::OPT_canonical_prefixes);
1533-
Args.ClaimAllArgs(options::OPT_no_canonical_prefixes);
1534-
1535-
// f(no-)integated-cc1 is also used very early in main.
1536-
Args.ClaimAllArgs(options::OPT_fintegrated_cc1);
1537-
Args.ClaimAllArgs(options::OPT_fno_integrated_cc1);
1538-
1539-
// Ignore -pipe.
1540-
Args.ClaimAllArgs(options::OPT_pipe);
1541-
1542-
// Extract -ccc args.
1543-
//
1544-
// FIXME: We need to figure out where this behavior should live. Most of it
1545-
// should be outside in the client; the parts that aren't should have proper
1546-
// options, either by introducing new ones or by overloading gcc ones like -V
1547-
// or -b.
1548-
CCCPrintPhases = Args.hasArg(options::OPT_ccc_print_phases);
1549-
CCCPrintBindings = Args.hasArg(options::OPT_ccc_print_bindings);
1550-
if (const Arg *A = Args.getLastArg(options::OPT_ccc_gcc_name))
1551-
CCCGenericGCCName = A->getValue();
1552-
1553-
// Process -fproc-stat-report options.
1554-
if (const Arg *A = Args.getLastArg(options::OPT_fproc_stat_report_EQ)) {
1555-
CCPrintProcessStats = true;
1556-
CCPrintStatReportFilename = A->getValue();
1557-
}
1558-
if (Args.hasArg(options::OPT_fproc_stat_report))
1559-
CCPrintProcessStats = true;
1560-
15611532
for (const Arg *A : Args.filtered(options::OPT_B)) {
15621533
A->claim();
15631534
PrefixDirs.push_back(A->getValue(0));
@@ -1572,6 +1543,13 @@ Compilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) {
15721543
CompilerPath = Split.second;
15731544
}
15741545
}
1546+
if (const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ))
1547+
SysRoot = A->getValue();
1548+
if (const Arg *A = Args.getLastArg(options::OPT__dyld_prefix_EQ))
1549+
DyldPrefix = A->getValue();
1550+
1551+
if (const Arg *A = Args.getLastArg(options::OPT_resource_dir))
1552+
ResourceDir = A->getValue();
15751553

15761554
if (const Arg *A = Args.getLastArg(options::OPT_save_temps_EQ)) {
15771555
SaveTemps = llvm::StringSwitch<SaveTempsMode>(A->getValue())
@@ -1591,6 +1569,8 @@ Compilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) {
15911569
Offload = OffloadHostDevice;
15921570
}
15931571

1572+
setLTOMode(Args);
1573+
15941574
// Process -fembed-bitcode= flags.
15951575
if (Arg *A = Args.getLastArg(options::OPT_fembed_bitcode_EQ)) {
15961576
StringRef Name = A->getValue();
@@ -1644,6 +1624,31 @@ Compilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) {
16441624
}
16451625
}
16461626

1627+
std::unique_ptr<llvm::opt::InputArgList> UArgs =
1628+
std::make_unique<InputArgList>(std::move(Args));
1629+
1630+
// Owned by the host.
1631+
const ToolChain &TC =
1632+
getToolChain(*UArgs, computeTargetTriple(*this, TargetTriple, *UArgs));
1633+
1634+
{
1635+
SmallVector<std::string> MultilibMacroDefinesStr =
1636+
TC.getMultilibMacroDefinesStr(*UArgs);
1637+
SmallVector<const char *> MLMacroDefinesChar(
1638+
llvm::map_range(MultilibMacroDefinesStr, [&UArgs](const auto &S) {
1639+
return UArgs->MakeArgString(Twine("-D") + Twine(S));
1640+
}));
1641+
bool MLContainsError;
1642+
auto MultilibMacroDefineList =
1643+
std::make_unique<InputArgList>(ParseArgStrings(
1644+
MLMacroDefinesChar, /*UseDriverMode=*/false, MLContainsError));
1645+
if (!MLContainsError) {
1646+
for (auto *Opt : *MultilibMacroDefineList) {
1647+
appendOneArg(*UArgs, Opt);
1648+
}
1649+
}
1650+
}
1651+
16471652
// Perform the default argument translations.
16481653
DerivedArgList *TranslatedArgs = TranslateInputArgs(*UArgs);
16491654

clang/lib/Driver/Multilib.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ std::pair<Multilib::flags_list, SmallVector<StringRef>>
154154
MultilibSet::processCustomFlags(const Driver &D,
155155
const Multilib::flags_list &Flags) const {
156156
Multilib::flags_list Result;
157-
SmallVector<StringRef> CompilationArgs;
157+
SmallVector<StringRef> MacroDefines;
158158

159159
// Custom flag values detected in the flags list
160160
SmallVector<const custom_flag::ValueDetail *> ClaimedCustomFlagValues;
@@ -193,9 +193,9 @@ MultilibSet::processCustomFlags(const Driver &D,
193193
if (!TriggeredCustomFlagDecls.insert(CustomFlagValue->Decl).second)
194194
continue;
195195
Result.push_back(std::string(custom_flag::Prefix) + CustomFlagValue->Name);
196-
if (CustomFlagValue->DriverArgs)
197-
CompilationArgs.append(CustomFlagValue->DriverArgs->begin(),
198-
CustomFlagValue->DriverArgs->end());
196+
if (CustomFlagValue->MacroDefines)
197+
MacroDefines.append(CustomFlagValue->MacroDefines->begin(),
198+
CustomFlagValue->MacroDefines->end());
199199
}
200200

201201
// Detect flag declarations with no value passed in. Select default value.
@@ -205,28 +205,28 @@ MultilibSet::processCustomFlags(const Driver &D,
205205
custom_flag::ValueDetail &CustomFlagValue =
206206
Decl->ValueList[*Decl->DefaultValueIdx];
207207
Result.push_back(std::string(custom_flag::Prefix) + CustomFlagValue.Name);
208-
if (CustomFlagValue.DriverArgs)
209-
CompilationArgs.append(CustomFlagValue.DriverArgs->begin(),
210-
CustomFlagValue.DriverArgs->end());
208+
if (CustomFlagValue.MacroDefines)
209+
MacroDefines.append(CustomFlagValue.MacroDefines->begin(),
210+
CustomFlagValue.MacroDefines->end());
211211
}
212212

213213
DiagnoseUnclaimedMultilibCustomFlags(D, UnclaimedCustomFlagValueStrs,
214214
CustomFlagDecls);
215215

216-
return {Result, CompilationArgs};
216+
return {Result, MacroDefines};
217217
}
218218

219219
bool MultilibSet::select(
220220
const Driver &D, const Multilib::flags_list &Flags,
221221
llvm::SmallVectorImpl<Multilib> &Selected,
222-
llvm::SmallVector<StringRef> *CustomFlagCompilationArgs) const {
223-
auto [FlagsWithCustom, CFCompilationArgs] = processCustomFlags(D, Flags);
222+
llvm::SmallVector<StringRef> *CustomFlagMacroDefines) const {
223+
auto [FlagsWithCustom, CFMacroDefines] = processCustomFlags(D, Flags);
224224
llvm::StringSet<> FlagSet(expandFlags(FlagsWithCustom));
225225
Selected.clear();
226226
bool AnyErrors = false;
227227

228-
if (CustomFlagCompilationArgs)
229-
*CustomFlagCompilationArgs = std::move(CFCompilationArgs);
228+
if (CustomFlagMacroDefines)
229+
*CustomFlagMacroDefines = std::move(CFMacroDefines);
230230

231231
// Decide which multilibs we're going to select at all.
232232
llvm::DenseSet<StringRef> ExclusiveGroupsSelected;

clang/lib/Driver/ToolChains/BareMetal.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ static void
166166
findMultilibsFromYAML(const ToolChain &TC, const Driver &D,
167167
StringRef MultilibPath, const ArgList &Args,
168168
DetectedMultilibs &Result,
169-
SmallVector<StringRef> &CustomFlagsCompilationArgs) {
169+
SmallVector<StringRef> &CustomFlagsMacroDefines) {
170170
llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> MB =
171171
D.getVFS().getBufferForFile(MultilibPath);
172172
if (!MB)
@@ -178,7 +178,7 @@ findMultilibsFromYAML(const ToolChain &TC, const Driver &D,
178178
return;
179179
Result.Multilibs = ErrorOrMultilibSet.get();
180180
if (Result.Multilibs.select(D, Flags, Result.SelectedMultilibs,
181-
&CustomFlagsCompilationArgs))
181+
&CustomFlagsMacroDefines))
182182
return;
183183
D.Diag(clang::diag::warn_drv_missing_multilib) << llvm::join(Flags, " ");
184184
std::stringstream ss;
@@ -237,13 +237,13 @@ void BareMetal::findMultilibs(const Driver &D, const llvm::Triple &Triple,
237237
// If multilib.yaml is found, update sysroot so it doesn't use a target
238238
// specific suffix
239239
SysRoot = computeBaseSysRoot(D, /*IncludeTriple=*/false);
240-
SmallVector<StringRef> CustomFlagDriverArgs;
240+
SmallVector<StringRef> CustomFlagMacroDefines;
241241
findMultilibsFromYAML(*this, D, *MultilibPath, Args, Result,
242-
CustomFlagDriverArgs);
242+
CustomFlagMacroDefines);
243243
SelectedMultilibs = Result.SelectedMultilibs;
244244
Multilibs = Result.Multilibs;
245-
MultilibDriverArgs.append(CustomFlagDriverArgs.begin(),
246-
CustomFlagDriverArgs.end());
245+
MultilibMacroDefines.append(CustomFlagMacroDefines.begin(),
246+
CustomFlagMacroDefines.end());
247247
} else if (isRISCVBareMetal(Triple)) {
248248
if (findRISCVMultilibs(D, Triple, Args, Result)) {
249249
SelectedMultilibs = Result.SelectedMultilibs;
@@ -560,6 +560,6 @@ SanitizerMask BareMetal::getSupportedSanitizers() const {
560560
}
561561

562562
SmallVector<std::string>
563-
BareMetal::getMultilibDriverArgsStr(llvm::opt::ArgList &Args) const {
564-
return MultilibDriverArgs;
565-
}
563+
BareMetal::getMultilibMacroDefinesStr(llvm::opt::ArgList &Args) const {
564+
return MultilibMacroDefines;
565+
}

clang/lib/Driver/ToolChains/BareMetal.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ class LLVM_LIBRARY_VISIBILITY BareMetal : public ToolChain {
7171
SanitizerMask getSupportedSanitizers() const override;
7272

7373
SmallVector<std::string>
74-
getMultilibDriverArgsStr(llvm::opt::ArgList &Args) const override;
74+
getMultilibMacroDefinesStr(llvm::opt::ArgList &Args) const override;
7575

7676
private:
7777
using OrderedMultilibs =
@@ -80,7 +80,7 @@ class LLVM_LIBRARY_VISIBILITY BareMetal : public ToolChain {
8080

8181
std::string SysRoot;
8282

83-
SmallVector<std::string> MultilibDriverArgs;
83+
SmallVector<std::string> MultilibMacroDefines;
8484
};
8585

8686
} // namespace toolchains

clang/test/Driver/baremetal-multilib-custom-flags.yaml

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,17 @@
3737
# CHECK-PRINT-MULTI-LIB: arm-none-eabi/multithreaded/thumb/v8-m.main/nofp;@-target=thumbv8m.main-unknown-none-eabi@mfpu=none@fmultilib-flag=multithreaded
3838

3939
# RUN: %clang --target=arm-none-eabi --multi-lib-config=%s -x c %s -fmultilib-flag=no-multithreaded -### -o /dev/null 2>&1 \
40-
# RUN: | FileCheck --check-prefix=CHECK-DRIVERARGS-NOMULTI %s
41-
# CHECK-DRIVERARGS-NOMULTI: "-D" "__SINGLE_THREAD__"
40+
# RUN: | FileCheck --check-prefix=CHECK-MACRODEFINES-NOMULTI %s
41+
# CHECK-MACRODEFINES-NOMULTI: "-D" "__SINGLE_THREAD__"
4242

4343
# RUN: %clang --target=arm-none-eabi --multi-lib-config=%s -x c %s -fmultilib-flag=io-semihosting -### -o /dev/null 2>&1 \
44-
# RUN: | FileCheck --check-prefix=CHECK-DRIVERARGS-IO-SEMIHOSTING %s
45-
# CHECK-DRIVERARGS-IO-SEMIHOSTING: "-D" "SEMIHOSTING"
44+
# RUN: | FileCheck --check-prefix=CHECK-MACRODEFINES-IO-SEMIHOSTING %s
45+
# CHECK-MACRODEFINES-IO-SEMIHOSTING: "-D" "SEMIHOSTING"
4646

4747
# RUN: %clang --target=arm-none-eabi --multi-lib-config=%s -x c %s -fmultilib-flag=io-linux-syscalls -### -o /dev/null 2>&1 \
48-
# RUN: | FileCheck --check-prefix=CHECK-DRIVERARGS-IO-LINUX %s
49-
# CHECK-DRIVERARGS-IO-LINUX: "-U" "SEMIHOSTING"
50-
# CHECK-DRIVERARGS-IO-LINUX-SAME: "-D" "LINUX_SYSCALLS"
48+
# RUN: | FileCheck --check-prefix=CHECK-MACRODEFINES-IO-LINUX %s
49+
# CHECK-MACRODEFINES-IO-LINUX: "-D" "LINUX_SYSCALLS"
50+
# CHECK-MACRODEFINES-IO-LINUX-SAME: "-D" "HOSTED"
5151

5252
---
5353
MultilibVersion: 1.0
@@ -68,14 +68,14 @@ Flags:
6868
- Name: multithreading
6969
Values:
7070
- Name: no-multithreaded
71-
DriverArgs: [-D__SINGLE_THREAD__]
71+
MacroDefines: [__SINGLE_THREAD__]
7272
- Name: multithreaded
7373
Default: no-multithreaded
7474
- Name: io
7575
Values:
7676
- Name: io-none
7777
- Name: io-semihosting
78-
DriverArgs: [-DSEMIHOSTING]
78+
MacroDefines: [SEMIHOSTING]
7979
- Name: io-linux-syscalls
80-
DriverArgs: [-USEMIHOSTING, -DLINUX_SYSCALLS]
80+
MacroDefines: [LINUX_SYSCALLS, HOSTED]
8181
Default: io-none

0 commit comments

Comments
 (0)