Skip to content

Commit 414c55e

Browse files
committed
Repurpose DriverArgs to MacroDefines
1 parent f5c6488 commit 414c55e

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
@@ -164,10 +164,10 @@ class MultilibSet {
164164
const_iterator end() const { return Multilibs.end(); }
165165

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

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
@@ -1273,9 +1273,7 @@ Compilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) {
12731273
bool HasConfigFileTail = !ContainsError && CfgOptionsTail;
12741274

12751275
// All arguments, from both config file and command line.
1276-
auto UArgs = std::make_unique<InputArgList>(
1277-
HasConfigFileHead ? std::move(*CfgOptionsHead) : std::move(*CLOptions));
1278-
InputArgList &Args = *UArgs;
1276+
InputArgList Args = HasConfigFileHead ? std::move(*CfgOptionsHead) : std::move(*CLOptions);
12791277

12801278
if (HasConfigFileHead)
12811279
for (auto *Opt : *CLOptions)
@@ -1303,6 +1301,52 @@ Compilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) {
13031301
}
13041302
}
13051303

1304+
// Check for working directory option before accessing any files
1305+
if (Arg *WD = Args.getLastArg(options::OPT_working_directory))
1306+
if (VFS->setCurrentWorkingDirectory(WD->getValue()))
1307+
Diag(diag::err_drv_unable_to_set_working_directory) << WD->getValue();
1308+
1309+
// Check for missing include directories.
1310+
if (!Diags.isIgnored(diag::warn_missing_include_dirs, SourceLocation())) {
1311+
for (auto IncludeDir : Args.getAllArgValues(options::OPT_I_Group)) {
1312+
if (!VFS->exists(IncludeDir))
1313+
Diag(diag::warn_missing_include_dirs) << IncludeDir;
1314+
}
1315+
}
1316+
1317+
// FIXME: This stuff needs to go into the Compilation, not the driver.
1318+
bool CCCPrintPhases;
1319+
1320+
// -canonical-prefixes, -no-canonical-prefixes are used very early in main.
1321+
Args.ClaimAllArgs(options::OPT_canonical_prefixes);
1322+
Args.ClaimAllArgs(options::OPT_no_canonical_prefixes);
1323+
1324+
// f(no-)integated-cc1 is also used very early in main.
1325+
Args.ClaimAllArgs(options::OPT_fintegrated_cc1);
1326+
Args.ClaimAllArgs(options::OPT_fno_integrated_cc1);
1327+
1328+
// Ignore -pipe.
1329+
Args.ClaimAllArgs(options::OPT_pipe);
1330+
1331+
// Extract -ccc args.
1332+
//
1333+
// FIXME: We need to figure out where this behavior should live. Most of it
1334+
// should be outside in the client; the parts that aren't should have proper
1335+
// options, either by introducing new ones or by overloading gcc ones like -V
1336+
// or -b.
1337+
CCCPrintPhases = Args.hasArg(options::OPT_ccc_print_phases);
1338+
CCCPrintBindings = Args.hasArg(options::OPT_ccc_print_bindings);
1339+
if (const Arg *A = Args.getLastArg(options::OPT_ccc_gcc_name))
1340+
CCCGenericGCCName = A->getValue();
1341+
1342+
// Process -fproc-stat-report options.
1343+
if (const Arg *A = Args.getLastArg(options::OPT_fproc_stat_report_EQ)) {
1344+
CCPrintProcessStats = true;
1345+
CCPrintStatReportFilename = A->getValue();
1346+
}
1347+
if (Args.hasArg(options::OPT_fproc_stat_report))
1348+
CCPrintProcessStats = true;
1349+
13061350
// FIXME: TargetTriple is used by the target-prefixed calls to as/ld
13071351
// and getToolChain is const.
13081352
if (IsCLMode()) {
@@ -1355,79 +1399,6 @@ Compilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) {
13551399
TargetTriple = A->getValue();
13561400
if (const Arg *A = Args.getLastArg(options::OPT_ccc_install_dir))
13571401
Dir = Dir = A->getValue();
1358-
if (const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ))
1359-
SysRoot = A->getValue();
1360-
if (const Arg *A = Args.getLastArg(options::OPT_resource_dir))
1361-
ResourceDir = A->getValue();
1362-
if (const Arg *A = Args.getLastArg(options::OPT__dyld_prefix_EQ))
1363-
DyldPrefix = A->getValue();
1364-
1365-
setLTOMode(Args);
1366-
1367-
// Owned by the host.
1368-
const ToolChain &TC =
1369-
getToolChain(Args, computeTargetTriple(*this, TargetTriple, Args));
1370-
1371-
SmallVector<std::string> MultilibDriverArgsStr =
1372-
TC.getMultilibDriverArgsStr(Args);
1373-
SmallVector<const char *> MLArgsChar(
1374-
llvm::map_range(MultilibDriverArgsStr, [&Args](const auto &S) {
1375-
return Args.MakeArgString(S);
1376-
}));
1377-
bool MLContainsError;
1378-
auto MultilibDriverArgList = std::make_unique<InputArgList>(
1379-
ParseArgStrings(MLArgsChar, /*UseDriverMode=*/false, MLContainsError));
1380-
if (!MLContainsError)
1381-
for (auto *Opt : *MultilibDriverArgList) {
1382-
appendOneArg(Args, Opt, nullptr);
1383-
}
1384-
1385-
// Check for working directory option before accessing any files
1386-
if (Arg *WD = Args.getLastArg(options::OPT_working_directory))
1387-
if (VFS->setCurrentWorkingDirectory(WD->getValue()))
1388-
Diag(diag::err_drv_unable_to_set_working_directory) << WD->getValue();
1389-
1390-
// Check for missing include directories.
1391-
if (!Diags.isIgnored(diag::warn_missing_include_dirs, SourceLocation())) {
1392-
for (auto IncludeDir : Args.getAllArgValues(options::OPT_I_Group)) {
1393-
if (!VFS->exists(IncludeDir))
1394-
Diag(diag::warn_missing_include_dirs) << IncludeDir;
1395-
}
1396-
}
1397-
1398-
// FIXME: This stuff needs to go into the Compilation, not the driver.
1399-
bool CCCPrintPhases;
1400-
1401-
// -canonical-prefixes, -no-canonical-prefixes are used very early in main.
1402-
Args.ClaimAllArgs(options::OPT_canonical_prefixes);
1403-
Args.ClaimAllArgs(options::OPT_no_canonical_prefixes);
1404-
1405-
// f(no-)integated-cc1 is also used very early in main.
1406-
Args.ClaimAllArgs(options::OPT_fintegrated_cc1);
1407-
Args.ClaimAllArgs(options::OPT_fno_integrated_cc1);
1408-
1409-
// Ignore -pipe.
1410-
Args.ClaimAllArgs(options::OPT_pipe);
1411-
1412-
// Extract -ccc args.
1413-
//
1414-
// FIXME: We need to figure out where this behavior should live. Most of it
1415-
// should be outside in the client; the parts that aren't should have proper
1416-
// options, either by introducing new ones or by overloading gcc ones like -V
1417-
// or -b.
1418-
CCCPrintPhases = Args.hasArg(options::OPT_ccc_print_phases);
1419-
CCCPrintBindings = Args.hasArg(options::OPT_ccc_print_bindings);
1420-
if (const Arg *A = Args.getLastArg(options::OPT_ccc_gcc_name))
1421-
CCCGenericGCCName = A->getValue();
1422-
1423-
// Process -fproc-stat-report options.
1424-
if (const Arg *A = Args.getLastArg(options::OPT_fproc_stat_report_EQ)) {
1425-
CCPrintProcessStats = true;
1426-
CCPrintStatReportFilename = A->getValue();
1427-
}
1428-
if (Args.hasArg(options::OPT_fproc_stat_report))
1429-
CCPrintProcessStats = true;
1430-
14311402
for (const Arg *A : Args.filtered(options::OPT_B)) {
14321403
A->claim();
14331404
PrefixDirs.push_back(A->getValue(0));
@@ -1442,6 +1413,13 @@ Compilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) {
14421413
CompilerPath = Split.second;
14431414
}
14441415
}
1416+
if (const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ))
1417+
SysRoot = A->getValue();
1418+
if (const Arg *A = Args.getLastArg(options::OPT__dyld_prefix_EQ))
1419+
DyldPrefix = A->getValue();
1420+
1421+
if (const Arg *A = Args.getLastArg(options::OPT_resource_dir))
1422+
ResourceDir = A->getValue();
14451423

14461424
if (const Arg *A = Args.getLastArg(options::OPT_save_temps_EQ)) {
14471425
SaveTemps = llvm::StringSwitch<SaveTempsMode>(A->getValue())
@@ -1461,6 +1439,8 @@ Compilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) {
14611439
Offload = OffloadHostDevice;
14621440
}
14631441

1442+
setLTOMode(Args);
1443+
14641444
// Process -fembed-bitcode= flags.
14651445
if (Arg *A = Args.getLastArg(options::OPT_fembed_bitcode_EQ)) {
14661446
StringRef Name = A->getValue();
@@ -1514,6 +1494,31 @@ Compilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) {
15141494
}
15151495
}
15161496

1497+
std::unique_ptr<llvm::opt::InputArgList> UArgs =
1498+
std::make_unique<InputArgList>(std::move(Args));
1499+
1500+
// Owned by the host.
1501+
const ToolChain &TC =
1502+
getToolChain(*UArgs, computeTargetTriple(*this, TargetTriple, *UArgs));
1503+
1504+
{
1505+
SmallVector<std::string> MultilibMacroDefinesStr =
1506+
TC.getMultilibMacroDefinesStr(*UArgs);
1507+
SmallVector<const char *> MLMacroDefinesChar(
1508+
llvm::map_range(MultilibMacroDefinesStr, [&UArgs](const auto &S) {
1509+
return UArgs->MakeArgString(Twine("-D") + Twine(S));
1510+
}));
1511+
bool MLContainsError;
1512+
auto MultilibMacroDefineList =
1513+
std::make_unique<InputArgList>(ParseArgStrings(
1514+
MLMacroDefinesChar, /*UseDriverMode=*/false, MLContainsError));
1515+
if (!MLContainsError) {
1516+
for (auto *Opt : *MultilibMacroDefineList) {
1517+
appendOneArg(*UArgs, Opt);
1518+
}
1519+
}
1520+
}
1521+
15171522
// Perform the default argument translations.
15181523
DerivedArgList *TranslatedArgs = TranslateInputArgs(*UArgs);
15191524

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)