aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
diff options
context:
space:
mode:
authorFangrui Song <i@maskray.me>2023-06-23 10:04:13 -0700
committerFangrui Song <i@maskray.me>2023-06-23 10:04:13 -0700
commit620bff758d448f04483a80455e14daa91f9c2346 (patch)
treeb557d71856032e9029261606e063d7875f06a649 /llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
parent9a868a902c2d9aec295612132445efd220c52e86 (diff)
downloadllvm-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.cpp15
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;
}