aboutsummaryrefslogtreecommitdiff
path: root/COFF
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2018-06-27 19:15:02 +0000
committerDimitry Andric <dim@FreeBSD.org>2018-06-27 19:15:02 +0000
commit384e0a667a03156faed5fb21210af8a9288a9122 (patch)
treed6ca6b097f252b802977b508309796c533b94cc5 /COFF
parentf0d24653c11c321b090f5fce1fef226689eb7930 (diff)
Vendor import of lld 6.0.1 release r335540:vendor/lld/lld-release_601-r335540vendor/lld-60
Notes
Notes: svn path=/vendor/lld/dist-release_60/; revision=335728 svn path=/vendor/lld/lld-release_601-r335540/; revision=335729; tag=vendor/lld/lld-release_601-r335540
Diffstat (limited to 'COFF')
-rw-r--r--COFF/Config.h1
-rw-r--r--COFF/Driver.cpp4
-rw-r--r--COFF/DriverUtils.cpp29
-rw-r--r--COFF/Options.td1
4 files changed, 35 insertions, 0 deletions
diff --git a/COFF/Config.h b/COFF/Config.h
index 93bef23a97f0..b01689930fac 100644
--- a/COFF/Config.h
+++ b/COFF/Config.h
@@ -175,6 +175,7 @@ struct Configuration {
bool AppContainer = false;
bool MinGW = false;
bool WarnLocallyDefinedImported = true;
+ bool KillAt = false;
};
extern Configuration *Config;
diff --git a/COFF/Driver.cpp b/COFF/Driver.cpp
index 0f3d8fb0b4ef..d4030588e211 100644
--- a/COFF/Driver.cpp
+++ b/COFF/Driver.cpp
@@ -970,6 +970,10 @@ void LinkerDriver::link(ArrayRef<const char *> ArgsArr) {
if (Args.hasArg(OPT_lldsavetemps))
Config->SaveTemps = true;
+ // Handle /kill-at
+ if (Args.hasArg(OPT_kill_at))
+ Config->KillAt = true;
+
// Handle /lldltocache
if (auto *Arg = Args.getLastArg(OPT_lldltocache))
Config->LTOCache = Arg->getValue();
diff --git a/COFF/DriverUtils.cpp b/COFF/DriverUtils.cpp
index e0641e04a017..4b3b6d5e09d6 100644
--- a/COFF/DriverUtils.cpp
+++ b/COFF/DriverUtils.cpp
@@ -561,6 +561,26 @@ static StringRef undecorate(StringRef Sym) {
return Sym.startswith("_") ? Sym.substr(1) : Sym;
}
+// Convert stdcall/fastcall style symbols into unsuffixed symbols,
+// with or without a leading underscore. (MinGW specific.)
+static StringRef killAt(StringRef Sym, bool Prefix) {
+ if (Sym.empty())
+ return Sym;
+ // Strip any trailing stdcall suffix
+ Sym = Sym.substr(0, Sym.find('@', 1));
+ if (!Sym.startswith("@")) {
+ if (Prefix && !Sym.startswith("_"))
+ return Saver.save("_" + Sym);
+ return Sym;
+ }
+ // For fastcall, remove the leading @ and replace it with an
+ // underscore, if prefixes are used.
+ Sym = Sym.substr(1);
+ if (Prefix)
+ Sym = Saver.save("_" + Sym);
+ return Sym;
+}
+
// Performs error checking on all /export arguments.
// It also sets ordinals.
void fixupExports() {
@@ -593,6 +613,15 @@ void fixupExports() {
}
}
+ if (Config->KillAt && Config->Machine == I386) {
+ for (Export &E : Config->Exports) {
+ E.Name = killAt(E.Name, true);
+ E.ExportName = killAt(E.ExportName, false);
+ E.ExtName = killAt(E.ExtName, true);
+ E.SymbolName = killAt(E.SymbolName, true);
+ }
+ }
+
// Uniquefy by name.
DenseMap<StringRef, Export *> Map(Config->Exports.size());
std::vector<Export> V;
diff --git a/COFF/Options.td b/COFF/Options.td
index 7d4cdba14f75..2a1de14657c1 100644
--- a/COFF/Options.td
+++ b/COFF/Options.td
@@ -121,6 +121,7 @@ def help_q : Flag<["/?", "-?"], "">, Alias<help>;
def debug_ghash : F<"debug:ghash">;
def debug_dwarf : F<"debug:dwarf">;
def export_all_symbols : F<"export-all-symbols">;
+def kill_at : F<"kill-at">;
def lldmingw : F<"lldmingw">;
def msvclto : F<"msvclto">;
def output_def : Joined<["/", "-"], "output-def:">;