[llvm] 95e3956 - Add an Offset field to the SourceLocation for LookupResult objects.
Greg Clayton via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 19 16:12:44 PST 2020
Author: Greg Clayton
Date: 2020-02-19T16:12:32-08:00
New Revision: 95e3956189a6722d1ec4b6d98fb855ee257e64fe
URL: https://github.com/llvm/llvm-project/commit/95e3956189a6722d1ec4b6d98fb855ee257e64fe
DIFF: https://github.com/llvm/llvm-project/commit/95e3956189a6722d1ec4b6d98fb855ee257e64fe.diff
LOG: Add an Offset field to the SourceLocation for LookupResult objects.
Summary:
The Offset provides the offset within the function in a SourceLocation struct. This allows us to show the byte offset within a function. We also track offsets within inline functions as well. Updated the lookup tests to verify the offset for functions and inline functions.
0x1000: main + 32 @ /tmp/main.cpp:45
Reviewers: labath, aadsm, serhiy.redko, jankratochvil, xiaobai, wallace, aprantl, JDevlieghere
Subscribers: hiraditya, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D74680
Added:
Modified:
llvm/include/llvm/DebugInfo/GSYM/LookupResult.h
llvm/lib/DebugInfo/GSYM/FunctionInfo.cpp
llvm/lib/DebugInfo/GSYM/InlineInfo.cpp
llvm/unittests/DebugInfo/GSYM/GSYMTest.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/DebugInfo/GSYM/LookupResult.h b/llvm/include/llvm/DebugInfo/GSYM/LookupResult.h
index 746fd36208e1..693a02c50f16 100644
--- a/llvm/include/llvm/DebugInfo/GSYM/LookupResult.h
+++ b/llvm/include/llvm/DebugInfo/GSYM/LookupResult.h
@@ -24,11 +24,13 @@ struct SourceLocation {
StringRef Dir; ///< Line entry source file directory path.
StringRef Base; ///< Line entry source file basename.
uint32_t Line = 0; ///< Source file line number.
+ uint32_t Offset = 0; ///< Byte size offset within the named function.
};
inline bool operator==(const SourceLocation &LHS, const SourceLocation &RHS) {
return LHS.Name == RHS.Name && LHS.Dir == RHS.Dir &&
- LHS.Base == RHS.Base && LHS.Line == RHS.Line;
+ LHS.Base == RHS.Base && LHS.Line == RHS.Line &&
+ LHS.Offset == RHS.Offset;
}
raw_ostream &operator<<(raw_ostream &OS, const SourceLocation &R);
diff --git a/llvm/lib/DebugInfo/GSYM/FunctionInfo.cpp b/llvm/lib/DebugInfo/GSYM/FunctionInfo.cpp
index a555d4e115ae..f8afd2c98050 100644
--- a/llvm/lib/DebugInfo/GSYM/FunctionInfo.cpp
+++ b/llvm/lib/DebugInfo/GSYM/FunctionInfo.cpp
@@ -223,6 +223,7 @@ llvm::Expected<LookupResult> FunctionInfo::lookup(DataExtractor &Data,
// location as best we can and return.
SourceLocation SrcLoc;
SrcLoc.Name = LR.FuncName;
+ SrcLoc.Offset = Addr - FuncAddr;
LR.Locations.push_back(SrcLoc);
return LR;
}
@@ -235,6 +236,7 @@ llvm::Expected<LookupResult> FunctionInfo::lookup(DataExtractor &Data,
SourceLocation SrcLoc;
SrcLoc.Name = LR.FuncName;
+ SrcLoc.Offset = Addr - FuncAddr;
SrcLoc.Dir = GR.getString(LineEntryFile->Dir);
SrcLoc.Base = GR.getString(LineEntryFile->Base);
SrcLoc.Line = LineEntry->Line;
diff --git a/llvm/lib/DebugInfo/GSYM/InlineInfo.cpp b/llvm/lib/DebugInfo/GSYM/InlineInfo.cpp
index 11f3d48d7b02..21679b1b78aa 100644
--- a/llvm/lib/DebugInfo/GSYM/InlineInfo.cpp
+++ b/llvm/lib/DebugInfo/GSYM/InlineInfo.cpp
@@ -145,10 +145,12 @@ static bool lookup(const GsymReader &GR, DataExtractor &Data, uint64_t &Offset,
if (CallFile->Dir || CallFile->Base) {
SourceLocation SrcLoc;
SrcLoc.Name = SrcLocs.back().Name;
+ SrcLoc.Offset = SrcLocs.back().Offset;
SrcLoc.Dir = GR.getString(CallFile->Dir);
SrcLoc.Base = GR.getString(CallFile->Base);
SrcLoc.Line = Inline.CallLine;
SrcLocs.back().Name = GR.getString(Inline.Name);
+ SrcLocs.back().Offset = Addr - Inline.Ranges[0].Start;
SrcLocs.push_back(SrcLoc);
}
return true;
diff --git a/llvm/unittests/DebugInfo/GSYM/GSYMTest.cpp b/llvm/unittests/DebugInfo/GSYM/GSYMTest.cpp
index d818edd72b4f..8a9afc14e09e 100644
--- a/llvm/unittests/DebugInfo/GSYM/GSYMTest.cpp
+++ b/llvm/unittests/DebugInfo/GSYM/GSYMTest.cpp
@@ -1362,45 +1362,45 @@ TEST(GSYMTest, TestGsymLookups) {
LR = GR->lookup(0x100F);
ASSERT_THAT_EXPECTED(LR, Succeeded());
EXPECT_THAT(LR->Locations,
- testing::ElementsAre(SourceLocation{"main", "/tmp", "main.c", 5}));
+ testing::ElementsAre(SourceLocation{"main", "/tmp", "main.c", 5, 15}));
LR = GR->lookup(0x1010);
ASSERT_THAT_EXPECTED(LR, Succeeded());
EXPECT_THAT(LR->Locations,
testing::ElementsAre(SourceLocation{"inline1", "/tmp", "foo.h", 10},
- SourceLocation{"main", "/tmp", "main.c", 6}));
+ SourceLocation{"main", "/tmp", "main.c", 6, 16}));
LR = GR->lookup(0x1012);
ASSERT_THAT_EXPECTED(LR, Succeeded());
EXPECT_THAT(LR->Locations,
testing::ElementsAre(SourceLocation{"inline2", "/tmp", "foo.h", 20},
- SourceLocation{"inline1", "/tmp", "foo.h", 33},
- SourceLocation{"main", "/tmp", "main.c", 6}));
+ SourceLocation{"inline1", "/tmp", "foo.h", 33, 2},
+ SourceLocation{"main", "/tmp", "main.c", 6, 18}));
LR = GR->lookup(0x1014);
ASSERT_THAT_EXPECTED(LR, Succeeded());
EXPECT_THAT(LR->Locations,
- testing::ElementsAre(SourceLocation{"inline1", "/tmp", "foo.h", 11},
- SourceLocation{"main", "/tmp", "main.c", 6}));
+ testing::ElementsAre(SourceLocation{"inline1", "/tmp", "foo.h", 11, 4},
+ SourceLocation{"main", "/tmp", "main.c", 6, 20}));
LR = GR->lookup(0x1016);
ASSERT_THAT_EXPECTED(LR, Succeeded());
EXPECT_THAT(LR->Locations,
testing::ElementsAre(SourceLocation{"inline3", "/tmp", "foo.h", 30},
- SourceLocation{"inline1", "/tmp", "foo.h", 35},
- SourceLocation{"main", "/tmp", "main.c", 6}));
+ SourceLocation{"inline1", "/tmp", "foo.h", 35, 6},
+ SourceLocation{"main", "/tmp", "main.c", 6, 22}));
LR = GR->lookup(0x1018);
ASSERT_THAT_EXPECTED(LR, Succeeded());
EXPECT_THAT(LR->Locations,
- testing::ElementsAre(SourceLocation{"inline1", "/tmp", "foo.h", 12},
- SourceLocation{"main", "/tmp", "main.c", 6}));
+ testing::ElementsAre(SourceLocation{"inline1", "/tmp", "foo.h", 12, 8},
+ SourceLocation{"main", "/tmp", "main.c", 6, 24}));
LR = GR->lookup(0x1020);
ASSERT_THAT_EXPECTED(LR, Succeeded());
EXPECT_THAT(LR->Locations,
- testing::ElementsAre(SourceLocation{"main", "/tmp", "main.c", 8}));
+ testing::ElementsAre(SourceLocation{"main", "/tmp", "main.c", 8, 32}));
}
@@ -1968,32 +1968,32 @@ TEST(GSYMTest, TestDWARFInlineInfo) {
LR = GR->lookup(0x1100-1);
ASSERT_THAT_EXPECTED(LR, Succeeded());
EXPECT_THAT(LR->Locations,
- testing::ElementsAre(SourceLocation{"main", "/tmp", "main.c", 10}));
+ testing::ElementsAre(SourceLocation{"main", "/tmp", "main.c", 10, 255}));
LR = GR->lookup(0x1100);
ASSERT_THAT_EXPECTED(LR, Succeeded());
EXPECT_THAT(LR->Locations,
testing::ElementsAre(SourceLocation{"inline1", "/tmp", "inline.h", 20},
- SourceLocation{"main", "/tmp", "main.c", 10}));
+ SourceLocation{"main", "/tmp", "main.c", 10, 256}));
LR = GR->lookup(0x1180-1);
ASSERT_THAT_EXPECTED(LR, Succeeded());
EXPECT_THAT(LR->Locations,
- testing::ElementsAre(SourceLocation{"inline1", "/tmp", "inline.h", 20},
- SourceLocation{"main", "/tmp", "main.c", 10}));
+ testing::ElementsAre(SourceLocation{"inline1", "/tmp", "inline.h", 20, 127},
+ SourceLocation{"main", "/tmp", "main.c", 10, 383}));
LR = GR->lookup(0x1180);
ASSERT_THAT_EXPECTED(LR, Succeeded());
EXPECT_THAT(LR->Locations,
- testing::ElementsAre(SourceLocation{"inline1", "/tmp", "inline.h", 21},
- SourceLocation{"main", "/tmp", "main.c", 10}));
+ testing::ElementsAre(SourceLocation{"inline1", "/tmp", "inline.h", 21, 128},
+ SourceLocation{"main", "/tmp", "main.c", 10, 384}));
LR = GR->lookup(0x1200-1);
ASSERT_THAT_EXPECTED(LR, Succeeded());
EXPECT_THAT(LR->Locations,
- testing::ElementsAre(SourceLocation{"inline1", "/tmp", "inline.h", 21},
- SourceLocation{"main", "/tmp", "main.c", 10}));
+ testing::ElementsAre(SourceLocation{"inline1", "/tmp", "inline.h", 21, 255},
+ SourceLocation{"main", "/tmp", "main.c", 10, 511}));
LR = GR->lookup(0x1200);
ASSERT_THAT_EXPECTED(LR, Succeeded());
EXPECT_THAT(LR->Locations,
- testing::ElementsAre(SourceLocation{"main", "/tmp", "main.c", 11}));
+ testing::ElementsAre(SourceLocation{"main", "/tmp", "main.c", 11, 512}));
}
More information about the llvm-commits
mailing list