SymbolPatterns unexportedSymbols;
SymbolPatterns whyLive;
+ std::vector<std::pair<llvm::StringRef, llvm::StringRef>> aliasedSymbols;
+
SymtabPresence localSymbolsPresence = SymtabPresence::All;
SymbolPatterns localSymbolPatterns;
OPT_call_graph_profile_sort, OPT_no_call_graph_profile_sort, true);
config->printSymbolOrder = args.getLastArgValue(OPT_print_symbol_order);
+ for (const Arg *arg : args.filtered(OPT_alias)) {
+ config->aliasedSymbols.push_back(
+ std::make_pair(arg->getValue(0), arg->getValue(1)));
+ }
+
// FIXME: Add a commandline flag for this too.
config->zeroModTime = getenv("ZERO_AR_DATE");
createSyntheticSections();
createSyntheticSymbols();
+ for (const auto &pair : config->aliasedSymbols) {
+ if (const auto &sym = symtab->find(pair.first)) {
+ if (const auto &defined = dyn_cast<Defined>(sym)) {
+ symtab->aliasDefined(defined, pair.second);
+ continue;
+ }
+ }
+
+ warn("undefined base symbol '" + pair.first + "' for alias '" +
+ pair.second + "'\n");
+ }
+
if (config->hasExplicitExports) {
parallelForEach(symtab->getSymbols(), [](Symbol *sym) {
if (auto *defined = dyn_cast<Defined>(sym)) {
def alias : MultiArg<["-"], "alias", 2>,
MetaVarName<"<symbol_name> <alternate_name>">,
HelpText<"Create a symbol alias with default global visibility">,
- Flags<[HelpHidden]>,
Group<grp_resolve>;
def alias_list : Separate<["-"], "alias_list">,
MetaVarName<"<file>">,
return defined;
}
+Defined *SymbolTable::aliasDefined(Defined *src, StringRef target) {
+ return addDefined(target, src->getFile(), src->isec, src->value, src->size,
+ src->isWeakDef(), src->privateExtern, src->thumb,
+ src->referencedDynamically, src->noDeadStrip,
+ src->weakDefCanBeHidden);
+}
+
Symbol *SymbolTable::addUndefined(StringRef name, InputFile *file,
bool isWeakRef) {
Symbol *s;
bool isReferencedDynamically, bool noDeadStrip,
bool isWeakDefCanBeHidden);
+ Defined *aliasDefined(Defined *src, StringRef target);
+
Symbol *addUndefined(StringRef name, InputFile *, bool isWeakRef);
Symbol *addCommon(StringRef name, InputFile *, uint64_t size, uint32_t align,
--- /dev/null
+# REQUIRES: x86
+# RUN: rm -rf %t; split-file %s %t
+
+# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-macos -o %t/foo.o %t/foo.s
+# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-macos -o %t/main.o %t/main.s
+
+# RUN: %lld -alias _foo _bar -u _bar -exported_symbol _bar %t/main.o %t/foo.o -o %t/bar.o
+# RUN: llvm-nm %t/bar.o | FileCheck %s --check-prefix=BAR
+
+# BAR: [[#%x,FOO_ADDR:]] T _bar
+# BAR: [[#FOO_ADDR]] t _foo
+
+# RUN: not %lld -alias _missing _bar -alias _missing2 _baz %t/main.o -o %t/missing.o %s 2>&1 | FileCheck %s --check-prefix=MISSING
+
+# MISSING-DAG: undefined base symbol '_missing' for alias '_bar'
+# MISSING-DAG: undefined base symbol '_missing2' for alias '_baz'
+
+# RUN: %lld -alias _foo _main %t/foo.o -o %t/main_rename.o
+# RUN: llvm-nm %t/main_rename.o | FileCheck %s --check-prefix=MAIN
+
+# MAIN: [[#%x,FOO_ADDR:]] T _foo
+# MAIN: [[#FOO_ADDR]] T _main
+
+# RUN: %lld -alias _foo _bar -alias _main _fake_main %t/main.o %t/foo.o -o %t/multiple.o
+# RUN: llvm-nm %t/multiple.o | FileCheck %s --check-prefix=MULTIPLE
+
+# MULTIPLE: [[#%x,FOO_ADDR:]] T _bar
+# MULTIPLE: [[#%x,MAIN_ADDR:]] T _fake_main
+# MULTIPLE: [[#FOO_ADDR]] T _foo
+# MULTIPLE: [[#MAIN_ADDR]] T _main
+
+#--- foo.s
+.globl _foo
+_foo:
+ ret
+
+#--- main.s
+.globl _main
+_main:
+ ret