[llvm-branch-commits] [lld, wasm] Replace config-> with ctx.arg. (PR #119835)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu Dec 12 23:51:17 PST 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-lld
Author: Fangrui Song (MaskRay)
<details>
<summary>Changes</summary>
---
Patch is 87.53 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/119835.diff
17 Files Affected:
- (modified) lld/wasm/Driver.cpp (+151-152)
- (modified) lld/wasm/InputChunks.cpp (+4-4)
- (modified) lld/wasm/InputChunks.h (+2-2)
- (modified) lld/wasm/InputElement.h (+2-2)
- (modified) lld/wasm/InputFiles.cpp (+7-7)
- (modified) lld/wasm/InputFiles.h (+1-1)
- (modified) lld/wasm/LTO.cpp (+40-40)
- (modified) lld/wasm/MapFile.cpp (+3-3)
- (modified) lld/wasm/MarkLive.cpp (+5-5)
- (modified) lld/wasm/OutputSections.cpp (+3-3)
- (modified) lld/wasm/Relocations.cpp (+10-10)
- (modified) lld/wasm/SymbolTable.cpp (+14-14)
- (modified) lld/wasm/Symbols.cpp (+3-3)
- (modified) lld/wasm/Symbols.h (+1-1)
- (modified) lld/wasm/SyntheticSections.cpp (+28-28)
- (modified) lld/wasm/SyntheticSections.h (+7-7)
- (modified) lld/wasm/Writer.cpp (+91-91)
``````````diff
diff --git a/lld/wasm/Driver.cpp b/lld/wasm/Driver.cpp
index 02471950fb5196..7b56bf90af3c1c 100644
--- a/lld/wasm/Driver.cpp
+++ b/lld/wasm/Driver.cpp
@@ -48,7 +48,7 @@ ConfigWrapper config;
Ctx ctx;
void errorOrWarn(const llvm::Twine &msg) {
- if (config->noinhibitExec)
+ if (ctx.arg.noinhibitExec)
warn(msg);
else
error(msg);
@@ -268,7 +268,7 @@ opt::InputArgList WasmOptTable::parse(ArrayRef<const char *> argv) {
static void readImportFile(StringRef filename) {
if (std::optional<MemoryBufferRef> buf = readFile(filename))
for (StringRef sym : args::getLines(*buf))
- config->allowUndefinedSymbols.insert(sym);
+ ctx.arg.allowUndefinedSymbols.insert(sym);
}
// Returns slices of MB by parsing MB as an archive file.
@@ -345,7 +345,7 @@ void LinkerDriver::addFile(StringRef path) {
case file_magic::bitcode:
case file_magic::wasm_object: {
auto obj = createObjectFile(mbref, "", 0, inLib);
- if (config->isStatic && isa<SharedFile>(obj)) {
+ if (ctx.arg.isStatic && isa<SharedFile>(obj)) {
error("attempted static link of dynamic object " + path);
break;
}
@@ -364,7 +364,7 @@ void LinkerDriver::addFile(StringRef path) {
}
static std::optional<std::string> findFromSearchPaths(StringRef path) {
- for (StringRef dir : config->searchPaths)
+ for (StringRef dir : ctx.arg.searchPaths)
if (std::optional<std::string> s = findFile(dir, path))
return s;
return std::nullopt;
@@ -373,8 +373,8 @@ static std::optional<std::string> findFromSearchPaths(StringRef path) {
// This is for -l<basename>. We'll look for lib<basename>.a from
// search paths.
static std::optional<std::string> searchLibraryBaseName(StringRef name) {
- for (StringRef dir : config->searchPaths) {
- if (!config->isStatic)
+ for (StringRef dir : ctx.arg.searchPaths) {
+ if (!ctx.arg.isStatic)
if (std::optional<std::string> s = findFile(dir, "lib" + name + ".so"))
return s;
if (std::optional<std::string> s = findFile(dir, "lib" + name + ".a"))
@@ -408,10 +408,10 @@ void LinkerDriver::createFiles(opt::InputArgList &args) {
addFile(arg->getValue());
break;
case OPT_Bstatic:
- config->isStatic = true;
+ ctx.arg.isStatic = true;
break;
case OPT_Bdynamic:
- config->isStatic = false;
+ ctx.arg.isStatic = false;
break;
case OPT_whole_archive:
inWholeArchive = true;
@@ -527,99 +527,98 @@ getBuildId(opt::InputArgList &args) {
// Initializes Config members by the command line options.
static void readConfigs(opt::InputArgList &args) {
- config->allowMultipleDefinition =
+ ctx.arg.allowMultipleDefinition =
hasZOption(args, "muldefs") ||
args.hasFlag(OPT_allow_multiple_definition,
OPT_no_allow_multiple_definition, false);
- config->bsymbolic = args.hasArg(OPT_Bsymbolic);
- config->checkFeatures =
+ ctx.arg.bsymbolic = args.hasArg(OPT_Bsymbolic);
+ ctx.arg.checkFeatures =
args.hasFlag(OPT_check_features, OPT_no_check_features, true);
- config->compressRelocations = args.hasArg(OPT_compress_relocations);
- config->demangle = args.hasFlag(OPT_demangle, OPT_no_demangle, true);
- config->disableVerify = args.hasArg(OPT_disable_verify);
- config->emitRelocs = args.hasArg(OPT_emit_relocs);
- config->experimentalPic = args.hasArg(OPT_experimental_pic);
- config->entry = getEntry(args);
- config->exportAll = args.hasArg(OPT_export_all);
- config->exportTable = args.hasArg(OPT_export_table);
- config->growableTable = args.hasArg(OPT_growable_table);
- config->noinhibitExec = args.hasArg(OPT_noinhibit_exec);
+ ctx.arg.compressRelocations = args.hasArg(OPT_compress_relocations);
+ ctx.arg.demangle = args.hasFlag(OPT_demangle, OPT_no_demangle, true);
+ ctx.arg.disableVerify = args.hasArg(OPT_disable_verify);
+ ctx.arg.emitRelocs = args.hasArg(OPT_emit_relocs);
+ ctx.arg.experimentalPic = args.hasArg(OPT_experimental_pic);
+ ctx.arg.entry = getEntry(args);
+ ctx.arg.exportAll = args.hasArg(OPT_export_all);
+ ctx.arg.exportTable = args.hasArg(OPT_export_table);
+ ctx.arg.growableTable = args.hasArg(OPT_growable_table);
+ ctx.arg.noinhibitExec = args.hasArg(OPT_noinhibit_exec);
if (args.hasArg(OPT_import_memory_with_name)) {
- config->memoryImport =
+ ctx.arg.memoryImport =
args.getLastArgValue(OPT_import_memory_with_name).split(",");
} else if (args.hasArg(OPT_import_memory)) {
- config->memoryImport =
+ ctx.arg.memoryImport =
std::pair<llvm::StringRef, llvm::StringRef>(defaultModule, memoryName);
} else {
- config->memoryImport =
+ ctx.arg.memoryImport =
std::optional<std::pair<llvm::StringRef, llvm::StringRef>>();
}
if (args.hasArg(OPT_export_memory_with_name)) {
- config->memoryExport =
- args.getLastArgValue(OPT_export_memory_with_name);
+ ctx.arg.memoryExport = args.getLastArgValue(OPT_export_memory_with_name);
} else if (args.hasArg(OPT_export_memory)) {
- config->memoryExport = memoryName;
+ ctx.arg.memoryExport = memoryName;
} else {
- config->memoryExport = std::optional<llvm::StringRef>();
+ ctx.arg.memoryExport = std::optional<llvm::StringRef>();
}
- config->sharedMemory = args.hasArg(OPT_shared_memory);
- config->soName = args.getLastArgValue(OPT_soname);
- config->importTable = args.hasArg(OPT_import_table);
- config->importUndefined = args.hasArg(OPT_import_undefined);
- config->ltoo = args::getInteger(args, OPT_lto_O, 2);
- if (config->ltoo > 3)
- error("invalid optimization level for LTO: " + Twine(config->ltoo));
+ ctx.arg.sharedMemory = args.hasArg(OPT_shared_memory);
+ ctx.arg.soName = args.getLastArgValue(OPT_soname);
+ ctx.arg.importTable = args.hasArg(OPT_import_table);
+ ctx.arg.importUndefined = args.hasArg(OPT_import_undefined);
+ ctx.arg.ltoo = args::getInteger(args, OPT_lto_O, 2);
+ if (ctx.arg.ltoo > 3)
+ error("invalid optimization level for LTO: " + Twine(ctx.arg.ltoo));
unsigned ltoCgo =
- args::getInteger(args, OPT_lto_CGO, args::getCGOptLevel(config->ltoo));
+ args::getInteger(args, OPT_lto_CGO, args::getCGOptLevel(ctx.arg.ltoo));
if (auto level = CodeGenOpt::getLevel(ltoCgo))
- config->ltoCgo = *level;
+ ctx.arg.ltoCgo = *level;
else
error("invalid codegen optimization level for LTO: " + Twine(ltoCgo));
- config->ltoPartitions = args::getInteger(args, OPT_lto_partitions, 1);
- config->ltoObjPath = args.getLastArgValue(OPT_lto_obj_path_eq);
- config->ltoDebugPassManager = args.hasArg(OPT_lto_debug_pass_manager);
- config->mapFile = args.getLastArgValue(OPT_Map);
- config->optimize = args::getInteger(args, OPT_O, 1);
- config->outputFile = args.getLastArgValue(OPT_o);
- config->relocatable = args.hasArg(OPT_relocatable);
- config->gcSections =
- args.hasFlag(OPT_gc_sections, OPT_no_gc_sections, !config->relocatable);
+ ctx.arg.ltoPartitions = args::getInteger(args, OPT_lto_partitions, 1);
+ ctx.arg.ltoObjPath = args.getLastArgValue(OPT_lto_obj_path_eq);
+ ctx.arg.ltoDebugPassManager = args.hasArg(OPT_lto_debug_pass_manager);
+ ctx.arg.mapFile = args.getLastArgValue(OPT_Map);
+ ctx.arg.optimize = args::getInteger(args, OPT_O, 1);
+ ctx.arg.outputFile = args.getLastArgValue(OPT_o);
+ ctx.arg.relocatable = args.hasArg(OPT_relocatable);
+ ctx.arg.gcSections =
+ args.hasFlag(OPT_gc_sections, OPT_no_gc_sections, !ctx.arg.relocatable);
for (auto *arg : args.filtered(OPT_keep_section))
- config->keepSections.insert(arg->getValue());
- config->mergeDataSegments =
+ ctx.arg.keepSections.insert(arg->getValue());
+ ctx.arg.mergeDataSegments =
args.hasFlag(OPT_merge_data_segments, OPT_no_merge_data_segments,
- !config->relocatable);
- config->pie = args.hasFlag(OPT_pie, OPT_no_pie, false);
- config->printGcSections =
+ !ctx.arg.relocatable);
+ ctx.arg.pie = args.hasFlag(OPT_pie, OPT_no_pie, false);
+ ctx.arg.printGcSections =
args.hasFlag(OPT_print_gc_sections, OPT_no_print_gc_sections, false);
- config->saveTemps = args.hasArg(OPT_save_temps);
- config->searchPaths = args::getStrings(args, OPT_library_path);
- config->shared = args.hasArg(OPT_shared);
- config->shlibSigCheck = !args.hasArg(OPT_no_shlib_sigcheck);
- config->stripAll = args.hasArg(OPT_strip_all);
- config->stripDebug = args.hasArg(OPT_strip_debug);
- config->stackFirst = args.hasArg(OPT_stack_first);
- config->trace = args.hasArg(OPT_trace);
- config->thinLTOCacheDir = args.getLastArgValue(OPT_thinlto_cache_dir);
- config->thinLTOCachePolicy = CHECK(
+ ctx.arg.saveTemps = args.hasArg(OPT_save_temps);
+ ctx.arg.searchPaths = args::getStrings(args, OPT_library_path);
+ ctx.arg.shared = args.hasArg(OPT_shared);
+ ctx.arg.shlibSigCheck = !args.hasArg(OPT_no_shlib_sigcheck);
+ ctx.arg.stripAll = args.hasArg(OPT_strip_all);
+ ctx.arg.stripDebug = args.hasArg(OPT_strip_debug);
+ ctx.arg.stackFirst = args.hasArg(OPT_stack_first);
+ ctx.arg.trace = args.hasArg(OPT_trace);
+ ctx.arg.thinLTOCacheDir = args.getLastArgValue(OPT_thinlto_cache_dir);
+ ctx.arg.thinLTOCachePolicy = CHECK(
parseCachePruningPolicy(args.getLastArgValue(OPT_thinlto_cache_policy)),
"--thinlto-cache-policy: invalid cache policy");
- config->thinLTOEmitImportsFiles = args.hasArg(OPT_thinlto_emit_imports_files);
- config->thinLTOEmitIndexFiles = args.hasArg(OPT_thinlto_emit_index_files) ||
+ ctx.arg.thinLTOEmitImportsFiles = args.hasArg(OPT_thinlto_emit_imports_files);
+ ctx.arg.thinLTOEmitIndexFiles = args.hasArg(OPT_thinlto_emit_index_files) ||
args.hasArg(OPT_thinlto_index_only) ||
args.hasArg(OPT_thinlto_index_only_eq);
- config->thinLTOIndexOnly = args.hasArg(OPT_thinlto_index_only) ||
+ ctx.arg.thinLTOIndexOnly = args.hasArg(OPT_thinlto_index_only) ||
args.hasArg(OPT_thinlto_index_only_eq);
- config->thinLTOIndexOnlyArg = args.getLastArgValue(OPT_thinlto_index_only_eq);
- config->thinLTOObjectSuffixReplace =
+ ctx.arg.thinLTOIndexOnlyArg = args.getLastArgValue(OPT_thinlto_index_only_eq);
+ ctx.arg.thinLTOObjectSuffixReplace =
getOldNewOptions(args, OPT_thinlto_object_suffix_replace_eq);
- std::tie(config->thinLTOPrefixReplaceOld, config->thinLTOPrefixReplaceNew,
- config->thinLTOPrefixReplaceNativeObject) =
+ std::tie(ctx.arg.thinLTOPrefixReplaceOld, ctx.arg.thinLTOPrefixReplaceNew,
+ ctx.arg.thinLTOPrefixReplaceNativeObject) =
getOldNewOptionsExtra(args, OPT_thinlto_prefix_replace_eq);
- if (config->thinLTOEmitIndexFiles && !config->thinLTOIndexOnly) {
+ if (ctx.arg.thinLTOEmitIndexFiles && !ctx.arg.thinLTOIndexOnly) {
if (args.hasArg(OPT_thinlto_object_suffix_replace_eq))
error("--thinlto-object-suffix-replace is not supported with "
"--thinlto-emit-index-files");
@@ -627,45 +626,45 @@ static void readConfigs(opt::InputArgList &args) {
error("--thinlto-prefix-replace is not supported with "
"--thinlto-emit-index-files");
}
- if (!config->thinLTOPrefixReplaceNativeObject.empty() &&
- config->thinLTOIndexOnlyArg.empty()) {
+ if (!ctx.arg.thinLTOPrefixReplaceNativeObject.empty() &&
+ ctx.arg.thinLTOIndexOnlyArg.empty()) {
error("--thinlto-prefix-replace=old_dir;new_dir;obj_dir must be used with "
"--thinlto-index-only=");
}
- config->unresolvedSymbols = getUnresolvedSymbolPolicy(args);
- config->whyExtract = args.getLastArgValue(OPT_why_extract);
+ ctx.arg.unresolvedSymbols = getUnresolvedSymbolPolicy(args);
+ ctx.arg.whyExtract = args.getLastArgValue(OPT_why_extract);
errorHandler().verbose = args.hasArg(OPT_verbose);
LLVM_DEBUG(errorHandler().verbose = true);
- config->tableBase = args::getInteger(args, OPT_table_base, 0);
- config->globalBase = args::getInteger(args, OPT_global_base, 0);
- config->initialHeap = args::getInteger(args, OPT_initial_heap, 0);
- config->initialMemory = args::getInteger(args, OPT_initial_memory, 0);
- config->maxMemory = args::getInteger(args, OPT_max_memory, 0);
- config->noGrowableMemory = args.hasArg(OPT_no_growable_memory);
- config->zStackSize =
+ ctx.arg.tableBase = args::getInteger(args, OPT_table_base, 0);
+ ctx.arg.globalBase = args::getInteger(args, OPT_global_base, 0);
+ ctx.arg.initialHeap = args::getInteger(args, OPT_initial_heap, 0);
+ ctx.arg.initialMemory = args::getInteger(args, OPT_initial_memory, 0);
+ ctx.arg.maxMemory = args::getInteger(args, OPT_max_memory, 0);
+ ctx.arg.noGrowableMemory = args.hasArg(OPT_no_growable_memory);
+ ctx.arg.zStackSize =
args::getZOptionValue(args, OPT_z, "stack-size", WasmPageSize);
// -Bdynamic by default if -pie or -shared is specified.
- if (config->pie || config->shared)
- config->isStatic = false;
+ if (ctx.arg.pie || ctx.arg.shared)
+ ctx.arg.isStatic = false;
- if (config->maxMemory != 0 && config->noGrowableMemory) {
+ if (ctx.arg.maxMemory != 0 && ctx.arg.noGrowableMemory) {
// Erroring out here is simpler than defining precedence rules.
error("--max-memory is incompatible with --no-growable-memory");
}
// Default value of exportDynamic depends on `-shared`
- config->exportDynamic =
- args.hasFlag(OPT_export_dynamic, OPT_no_export_dynamic, config->shared);
+ ctx.arg.exportDynamic =
+ args.hasFlag(OPT_export_dynamic, OPT_no_export_dynamic, ctx.arg.shared);
// Parse wasm32/64.
if (auto *arg = args.getLastArg(OPT_m)) {
StringRef s = arg->getValue();
if (s == "wasm32")
- config->is64 = false;
+ ctx.arg.is64 = false;
else if (s == "wasm64")
- config->is64 = true;
+ ctx.arg.is64 = true;
else
error("invalid target architecture: " + s);
}
@@ -679,36 +678,36 @@ static void readConfigs(opt::InputArgList &args) {
error(arg->getSpelling() + ": expected a positive integer, but got '" +
arg->getValue() + "'");
parallel::strategy = hardware_concurrency(threads);
- config->thinLTOJobs = v;
+ ctx.arg.thinLTOJobs = v;
}
if (auto *arg = args.getLastArg(OPT_thinlto_jobs))
- config->thinLTOJobs = arg->getValue();
+ ctx.arg.thinLTOJobs = arg->getValue();
if (auto *arg = args.getLastArg(OPT_features)) {
- config->features =
+ ctx.arg.features =
std::optional<std::vector<std::string>>(std::vector<std::string>());
for (StringRef s : arg->getValues())
- config->features->push_back(std::string(s));
+ ctx.arg.features->push_back(std::string(s));
}
if (auto *arg = args.getLastArg(OPT_extra_features)) {
- config->extraFeatures =
+ ctx.arg.extraFeatures =
std::optional<std::vector<std::string>>(std::vector<std::string>());
for (StringRef s : arg->getValues())
- config->extraFeatures->push_back(std::string(s));
+ ctx.arg.extraFeatures->push_back(std::string(s));
}
// Legacy --allow-undefined flag which is equivalent to
// --unresolve-symbols=ignore + --import-undefined
if (args.hasArg(OPT_allow_undefined)) {
- config->importUndefined = true;
- config->unresolvedSymbols = UnresolvedPolicy::Ignore;
+ ctx.arg.importUndefined = true;
+ ctx.arg.unresolvedSymbols = UnresolvedPolicy::Ignore;
}
if (args.hasArg(OPT_print_map))
- config->mapFile = "-";
+ ctx.arg.mapFile = "-";
- std::tie(config->buildId, config->buildIdVector) = getBuildId(args);
+ std::tie(ctx.arg.buildId, ctx.arg.buildIdVector) = getBuildId(args);
}
// Some Config members do not directly correspond to any particular
@@ -716,86 +715,86 @@ static void readConfigs(opt::InputArgList &args) {
// This function initialize such members. See Config.h for the details
// of these values.
static void setConfigs() {
- ctx.isPic = config->pie || config->shared;
+ ctx.isPic = ctx.arg.pie || ctx.arg.shared;
if (ctx.isPic) {
- if (config->exportTable)
+ if (ctx.arg.exportTable)
error("-shared/-pie is incompatible with --export-table");
- config->importTable = true;
+ ctx.arg.importTable = true;
} else {
// Default table base. Defaults to 1, reserving 0 for the NULL function
// pointer.
- if (!config->tableBase)
- config->tableBase = 1;
+ if (!ctx.arg.tableBase)
+ ctx.arg.tableBase = 1;
// The default offset for static/global data, for when --global-base is
// not specified on the command line. The precise value of 1024 is
// somewhat arbitrary, and pre-dates wasm-ld (Its the value that
// emscripten used prior to wasm-ld).
- if (!config->globalBase && !config->relocatable && !config->stackFirst)
- config->globalBase = 1024;
+ if (!ctx.arg.globalBase && !ctx.arg.relocatable && !ctx.arg.stackFirst)
+ ctx.arg.globalBase = 1024;
}
- if (config->relocatable) {
- if (config->exportTable)
+ if (ctx.arg.relocatable) {
+ if (ctx.arg.exportTable)
error("--relocatable is incompatible with --export-table");
- if (config->growableTable)
+ if (ctx.arg.growableTable)
error("--relocatable is incompatible with --growable-table");
// Ignore any --import-table, as it's redundant.
- config->importTable = true;
+ ctx.arg.importTable = true;
}
- if (config->shared) {
- if (config->memoryExport.has_value()) {
+ if (ctx.arg.shared) {
+ if (ctx.arg.memoryExport.has_value()) {
error("--export-memory is incompatible with --shared");
}
- if (!config->memoryImport.has_value()) {
- config->memoryImport =
- std::pair<llvm::StringRef, llvm::StringRef>(defaultModule, memoryName);
+ if (!ctx.arg.memoryImport.has_value()) {
+ ctx.arg.memoryImport = std::pair<llvm::StringRef, llvm::StringRef>(
+ defaultModule, memoryName);
}
}
// If neither export-memory nor import-memory is specified, default to
// exporting memory under its default name.
- if (!config->memoryExport.has_value() && !config->memoryImport.has_value()) {
- config->memoryExport = memoryName;
+ if (!ctx.arg.memoryExport.has_value() && !ctx.arg.memoryImport.has_value()) {
+ ctx.arg.memoryExport = memoryName;
}
}
// Some command line options or some combinations of them are not allowed.
// This function checks for such errors.
static void checkOptions(opt::InputArgList &args) {
- if (!config->stripDebug && !config->stripAll && config->compressRelocations)
+ if (!ctx.arg.stripDebug && !ctx.arg.stripAll && ctx.arg.compressRelocations)
error("--compress-relocations is incompatible with output debug"
" information. Please pass --strip-debug or --strip-all");
- if (config->ltoPartitions == 0)
+ if (ctx.arg.ltoPartitions == 0)
error("--lto-partitions: number of threads must be > 0");
- if (!get_threadpool_strategy(config->thinLTOJobs))
- error("--thinlto-jobs: invalid job count: " + config->thinLTOJobs);
+ if (!get_threadpool_strategy(ctx.arg.thinLTOJobs))
+ error("--thinlto-jobs: invalid job count: " + ctx.arg.thinLTOJobs);
- if (config->pie && config->shared)
+ if (ctx.arg.pie && ctx.arg.shared)
error("-shared and -pie may not be used together");
- if (config->outputFile.empty() && !config->thinLTOIndexOnly)
+ if (ctx.arg.outputFile.empty() && !ctx.arg.thinLTOIndexOnly)
error("no output file specified");
- if (config->importTable && config->exportTable)
+ if (ctx.arg.importTable && ctx.arg.exportTable)
error("--import-table and --export-table may not be used together");
- if (config->relocatable) {
- if (!config->entry.empty())
+ if (ctx.arg.relocatable) {
+ if (!ctx.arg.entry.empty())
error("entry point specified for relocatable output file");
- if (config->gcSections)
+ if (ctx.arg.gcSections)
error("-r and --gc-sections may not be used together");
- if (config->compressRelocations)
+ if (ctx.arg.compressRelocations)
error("-r -and --compress-relocations may not be used together");
if (args.hasArg(OPT_undefined))
error("-r -and --undefined may not be used together");
- if (config->pie)
+ if (ctx.arg.pie)
error("-r and -pie may not be used together");
- if (config->sharedMemory)
+ if (ctx.arg.sharedMemory)
error("-r and --shared-memory may not be used together");
- if (config->globalBase)
+ if (ctx.arg.globalBase)
error("-r and --global-base may not by used together...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/119835
More information about the llvm-branch-commits
mailing list