diff options
author | Hung-ying Tyan <tyanh@google.com> | 2020-09-02 05:09:21 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2020-09-02 05:09:21 +0000 |
commit | 89b30eb1a1752e98c40eb5a1e4855c2f5a11d252 (patch) | |
tree | b2b38ba9690a888c48c52f0dae9281f1e528ceef | |
parent | b91051336473d72f6aa8933e19134f03ade5e719 (diff) | |
parent | 2e92be92bf80630de1eec348827cbebe2060f299 (diff) | |
download | slang-android10-gsi.tar.gz |
Merge "Merge branch android10-qpr3-release" into android10-gsiandroid10-gsi
-rw-r--r-- | Android.bp | 18 | ||||
-rw-r--r-- | lld_main.cpp | 66 |
2 files changed, 84 insertions, 0 deletions
@@ -194,6 +194,24 @@ cc_binary_host { }, } +cc_binary_host { + name: "lld", + srcs: ["lld_main.cpp"], + ldflags: ["-static"], + stl: "libc++_static", + target: { + darwin: { + enabled: false, + }, + linux: { + enabled: false, + }, + windows: { + enabled: true, + }, + }, +} + subdirs = [ "BitWriter_2_9", "BitWriter_2_9_func", diff --git a/lld_main.cpp b/lld_main.cpp new file mode 100644 index 0000000..dc095bd --- /dev/null +++ b/lld_main.cpp @@ -0,0 +1,66 @@ +/* + * Copyright 2020, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <cstdio> +#include <cstdlib> +#include <string> +#include <vector> +#include <unistd.h> + +int main(int argc, const char **argv) { + // Create a copy of argv strings that we can modify, and then eventually + // const_cast away the const-ness of the buffers to call execv(). + std::vector<std::unique_ptr<std::string>> argv_strings; + std::vector<const char *> argv_chars; + + // Replace lld.exe with lld-bin\lld.exe instead on Windows. + argv_strings.push_back(std::make_unique<std::string>(argv[0])); + size_t idx = argv_strings[0]->rfind("lld.exe"); + argv_strings[0]->insert(idx, "lld-bin\\"); + argv_chars.push_back(argv_strings[0]->c_str()); + + // Make a copy of every other argv entry, and map a pointer to the C string + // buffer as argv_chars for use with execv() later. + for (int i = 1; i < argc; ++i) { + argv_strings.push_back(std::make_unique<std::string>(argv[i])); + argv_chars.push_back(argv_strings[i]->c_str()); + } + + // execv() expects a nullptr to terminate the argument list for argv. + argv_chars.push_back(nullptr); + + // We cast away the const-ness of the char buffers, but it should be safe, + // since we own these strings. + int status = execv(argv_chars[0], const_cast<char **>(argv_chars.data())); + + // We shouldn't get here unless we failed to execute the new binary. + if (status != 0) { + std::string command; + bool first = true; + for (auto arg : argv_chars) { + if (arg) { + if (!first) { + command.append(" "); + } else { + first = false; + } + command.append(arg); + } + } + fprintf(stderr, "Failed to execute command: %s\n", command.c_str()); + } + return status; +} |