aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
diff options
context:
space:
mode:
authorSerge Pavlov <sepavloff@gmail.com>2023-08-09 13:56:57 +0700
committerSerge Pavlov <sepavloff@gmail.com>2023-08-09 13:56:57 +0700
commit13bb74842bdabc6ae72d36f8cf5190f2fbb352b2 (patch)
treecc92b29699af53d4f210f61bde6eb4c07780c56f /llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
parentbeb937e8dda4b68345badb43939eabf28c12d2d4 (diff)
downloadllvm-13bb74842bdabc6ae72d36f8cf5190f2fbb352b2.zip
llvm-13bb74842bdabc6ae72d36f8cf5190f2fbb352b2.tar.gz
llvm-13bb74842bdabc6ae72d36f8cf5190f2fbb352b2.tar.bz2
[symbolizer][NFC] Move file argument parsing into separate function
The code that gets binary file name is moved to a separate function. It makes the code of `parseCommand` cleaner and allows to reuse the parsing code. Differential Revision: https://reviews.llvm.org/D156978
Diffstat (limited to 'llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp')
-rw-r--r--llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp50
1 files changed, 29 insertions, 21 deletions
diff --git a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
index 811aeae..ba9df51 100644
--- a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
+++ b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
@@ -127,11 +127,32 @@ static void enableDebuginfod(LLVMSymbolizer &Symbolizer,
HTTPClient::initialize();
}
+static StringRef getSpaceDelimitedWord(StringRef &Source) {
+ const char kDelimiters[] = " \n\r";
+ const char *Pos = Source.data();
+ StringRef Result;
+ Pos += strspn(Pos, kDelimiters);
+ if (*Pos == '"' || *Pos == '\'') {
+ char Quote = *Pos;
+ Pos++;
+ const char *End = strchr(Pos, Quote);
+ if (!End)
+ return StringRef();
+ Result = StringRef(Pos, End - Pos);
+ Pos = End + 1;
+ } else {
+ int NameLength = strcspn(Pos, kDelimiters);
+ Result = StringRef(Pos, NameLength);
+ Pos += NameLength;
+ }
+ Source = StringRef(Pos, Source.end() - Pos);
+ return Result;
+}
+
static bool parseCommand(StringRef BinaryName, bool IsAddr2Line,
StringRef InputString, Command &Cmd,
std::string &ModuleName, object::BuildID &BuildID,
uint64_t &ModuleOffset) {
- const char kDelimiters[] = " \n\r";
ModuleName = "";
if (InputString.consume_front("CODE ")) {
Cmd = Command::Code;
@@ -144,7 +165,6 @@ static bool parseCommand(StringRef BinaryName, bool IsAddr2Line,
Cmd = Command::Code;
}
- const char *Pos;
// Skip delimiters and parse input filename (if needed).
if (BinaryName.empty() && BuildID.empty()) {
bool HasFilePrefix = false;
@@ -167,21 +187,9 @@ static bool parseCommand(StringRef BinaryName, bool IsAddr2Line,
if (HasFilePrefix && HasBuildIDPrefix)
return false;
- Pos = InputString.data();
- Pos += strspn(Pos, kDelimiters);
- if (*Pos == '"' || *Pos == '\'') {
- char Quote = *Pos;
- Pos++;
- const char *End = strchr(Pos, Quote);
- if (!End)
- return false;
- ModuleName = std::string(Pos, End - Pos);
- Pos = End + 1;
- } else {
- int NameLength = strcspn(Pos, kDelimiters);
- ModuleName = std::string(Pos, NameLength);
- Pos += NameLength;
- }
+ ModuleName = getSpaceDelimitedWord(InputString);
+ if (ModuleName.empty())
+ return false;
if (HasBuildIDPrefix) {
BuildID = parseBuildID(ModuleName);
if (BuildID.empty())
@@ -189,13 +197,13 @@ static bool parseCommand(StringRef BinaryName, bool IsAddr2Line,
ModuleName.clear();
}
} else {
- Pos = InputString.data();
ModuleName = BinaryName.str();
}
+
// Skip delimiters and parse module offset.
- Pos += strspn(Pos, kDelimiters);
- int OffsetLength = strcspn(Pos, kDelimiters);
- StringRef Offset(Pos, OffsetLength);
+ InputString = InputString.ltrim();
+ int OffsetLength = InputString.find_first_of(" \n\r");
+ StringRef Offset = InputString.substr(0, OffsetLength);
// GNU addr2line assumes the offset is hexadecimal and allows a redundant
// "0x" or "0X" prefix; do the same for compatibility.
if (IsAddr2Line)