[llvm] 13bb748 - [symbolizer][NFC] Move file argument parsing into separate function
Serge Pavlov via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 8 23:59:34 PDT 2023
Author: Serge Pavlov
Date: 2023-08-09T13:56:57+07:00
New Revision: 13bb74842bdabc6ae72d36f8cf5190f2fbb352b2
URL: https://github.com/llvm/llvm-project/commit/13bb74842bdabc6ae72d36f8cf5190f2fbb352b2
DIFF: https://github.com/llvm/llvm-project/commit/13bb74842bdabc6ae72d36f8cf5190f2fbb352b2.diff
LOG: [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
Added:
Modified:
llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
Removed:
################################################################################
diff --git a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
index 811aeae9162117..ba9df51d5a5865 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)
More information about the llvm-commits
mailing list