diff options
author | Rui Ueyama <ruiu@google.com> | 2017-04-26 21:23:11 +0000 |
---|---|---|
committer | Rui Ueyama <ruiu@google.com> | 2017-04-26 21:23:11 +0000 |
commit | 08af54c3043e274b696e5b6e2018f8c8a227fec1 (patch) | |
tree | ccf08aaab7acc6a7e264b7231a2e114092ac9ab3 | |
parent | 11817ba2ea27833341104416cd5385bec84c2a14 (diff) | |
download | bcm5719-llvm-08af54c3043e274b696e5b6e2018f8c8a227fec1.tar.gz bcm5719-llvm-08af54c3043e274b696e5b6e2018f8c8a227fec1.zip |
Factor out code to parse -build-id. NFC.
llvm-svn: 301475
-rw-r--r-- | lld/ELF/Driver.cpp | 51 |
1 files changed, 28 insertions, 23 deletions
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index 68eb5616a5c..3e5b8dceeff 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -550,6 +550,33 @@ static std::pair<bool, bool> getHashStyle(opt::InputArgList &Args) { return {true, true}; } +// Parse --build-id or --build-id=<style>. We handle "tree" as a +// synonym for "sha1" because all our hash functions including +// -build-id=sha1 are actually tree hashes for performance reasons. +static std::pair<BuildIdKind, std::vector<uint8_t>> +getBuildId(opt::InputArgList &Args) { + if (Args.hasArg(OPT_build_id)) + return {BuildIdKind::Fast, {}}; + + auto *Arg = Args.getLastArg(OPT_build_id_eq); + if (!Arg) + return {BuildIdKind::None, {}}; + + StringRef S = Arg->getValue(); + if (S == "md5") + return {BuildIdKind::Md5, {}}; + if (S == "sha1" || S == "tree") + return {BuildIdKind::Sha1, {}}; + if (S == "uuid") + return {BuildIdKind::Uuid, {}}; + if (S.startswith("0x")) + return {BuildIdKind::Hexstring, parseHex(S.substr(2))}; + + if (S != "none") + error("unknown --build-id style: " + S); + return {BuildIdKind::None, {}}; +} + static std::vector<StringRef> getLines(MemoryBufferRef MB) { SmallVector<StringRef, 0> Arr; MB.getBuffer().split(Arr, '\n'); @@ -679,29 +706,7 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) { Config->ZRelro = false; std::tie(Config->SysvHash, Config->GnuHash) = getHashStyle(Args); - - // Parse --build-id or --build-id=<style>. We handle "tree" as a - // synonym for "sha1" because all of our hash functions including - // -build-id=sha1 are tree hashes for performance reasons. - if (Args.hasArg(OPT_build_id)) - Config->BuildId = BuildIdKind::Fast; - if (auto *Arg = Args.getLastArg(OPT_build_id_eq)) { - StringRef S = Arg->getValue(); - if (S == "md5") { - Config->BuildId = BuildIdKind::Md5; - } else if (S == "sha1" || S == "tree") { - Config->BuildId = BuildIdKind::Sha1; - } else if (S == "uuid") { - Config->BuildId = BuildIdKind::Uuid; - } else if (S == "none") { - Config->BuildId = BuildIdKind::None; - } else if (S.startswith("0x")) { - Config->BuildId = BuildIdKind::Hexstring; - Config->BuildIdVector = parseHex(S.substr(2)); - } else { - error("unknown --build-id style: " + S); - } - } + std::tie(Config->BuildId, Config->BuildIdVector) = getBuildId(Args); if (!Config->Shared && !Config->AuxiliaryList.empty()) error("-f may not be used without -shared"); |