diff options
author | Fangrui Song <i@maskray.me> | 2023-06-23 10:04:13 -0700 |
---|---|---|
committer | Fangrui Song <i@maskray.me> | 2023-06-23 10:04:13 -0700 |
commit | 620bff758d448f04483a80455e14daa91f9c2346 (patch) | |
tree | b557d71856032e9029261606e063d7875f06a649 /llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp | |
parent | 9a868a902c2d9aec295612132445efd220c52e86 (diff) | |
download | llvm-620bff758d448f04483a80455e14daa91f9c2346.zip llvm-620bff758d448f04483a80455e14daa91f9c2346.tar.gz llvm-620bff758d448f04483a80455e14daa91f9c2346.tar.bz2 |
[llvm-addr2line] Replace checkFileExists with getOrCreateModuleInfo
GNU addr2line exits immediately if -e (default to a.out) specifies a file that
cannot be open or a directory. llvm-addr2line used to wait for input on if the
input file cannot be open and addresses are not specified in command line.
Replace the D147652 checkFileExists with getOrCreateModuleInfo to avoid
a separate `sys::fs::status` operation.
Reviewed By: sepavloff
Differential Revision: https://reviews.llvm.org/D153595
Diffstat (limited to 'llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp')
-rw-r--r-- | llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp index 7b49ec2..a9e9830 100644 --- a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp +++ b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp @@ -478,12 +478,15 @@ int main(int argc, char **argv) { else Printer = std::make_unique<LLVMPrinter>(outs(), printError, Config); - StringRef InputFile = Args.getLastArgValue(OPT_obj_EQ); - if (!InputFile.empty() && IsAddr2Line) { - Error Status = Symbolizer.checkFileExists(InputFile); - if (Status) { - handleAllErrors(std::move(Status), [&](const ErrorInfoBase &EI) { - printError(EI, InputFile); + // When an input file is specified, exit immediately if the file cannot be + // read. If getOrCreateModuleInfo succeeds, symbolizeInput will reuse the + // cached file handle. + if (auto *Arg = Args.getLastArg(OPT_obj_EQ); Arg && IsAddr2Line) { + auto Status = Symbolizer.getOrCreateModuleInfo(Arg->getValue()); + if (!Status) { + Request SymRequest = {Arg->getValue(), 0}; + handleAllErrors(Status.takeError(), [&](const ErrorInfoBase &EI) { + Printer->printError(SymRequest, EI); }); return EXIT_FAILURE; } |