Skip to content

Commit

Permalink
[lld-macho] Add support for -alias
Browse files Browse the repository at this point in the history
This creates a symbol alias similar to --defsym in the elf linker. This
is used by swiftpm for all executables, so it's useful to support. This
doesn't implement -alias_list but that could be done pretty easily as
needed.

Differential Revision: https://reviews.llvm.org/D129938
  • Loading branch information
keith committed Jul 19, 2022
1 parent 374db8f commit 0bc1009
Show file tree
Hide file tree
Showing 6 changed files with 68 additions and 1 deletion.
2 changes: 2 additions & 0 deletions lld/MachO/Config.h
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,8 @@ struct Configuration {
SymbolPatterns unexportedSymbols;
SymbolPatterns whyLive;

std::vector<std::pair<llvm::StringRef, llvm::StringRef>> aliasedSymbols;

SymtabPresence localSymbolsPresence = SymtabPresence::All;
SymbolPatterns localSymbolPatterns;

Expand Down
17 changes: 17 additions & 0 deletions lld/MachO/Driver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1306,6 +1306,11 @@ bool macho::link(ArrayRef<const char *> argsArr, llvm::raw_ostream &stdoutOS,
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");

Expand Down Expand Up @@ -1558,6 +1563,18 @@ bool macho::link(ArrayRef<const char *> argsArr, llvm::raw_ostream &stdoutOS,
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)) {
Expand Down
1 change: 0 additions & 1 deletion lld/MachO/Options.td
Original file line number Diff line number Diff line change
Expand Up @@ -505,7 +505,6 @@ def reexported_symbols_list : Separate<["-"], "reexported_symbols_list">,
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>">,
Expand Down
7 changes: 7 additions & 0 deletions lld/MachO/SymbolTable.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,13 @@ Defined *SymbolTable::addDefined(StringRef name, InputFile *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;
Expand Down
2 changes: 2 additions & 0 deletions lld/MachO/SymbolTable.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ class SymbolTable {
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,
Expand Down
40 changes: 40 additions & 0 deletions lld/test/MachO/aliases.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# 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

0 comments on commit 0bc1009

Please sign in to comment.