aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/linux/dwarf_cu_to_module.cc30
-rw-r--r--src/common/linux/dwarf_cu_to_module_unittest.cc18
2 files changed, 28 insertions, 20 deletions
diff --git a/src/common/linux/dwarf_cu_to_module.cc b/src/common/linux/dwarf_cu_to_module.cc
index 88cea940..19efafd0 100644
--- a/src/common/linux/dwarf_cu_to_module.cc
+++ b/src/common/linux/dwarf_cu_to_module.cc
@@ -327,16 +327,11 @@ void DwarfCUToModule::FuncHandler::ProcessAttributeUnsigned(
enum DwarfForm form,
uint64 data) {
switch (attr) {
- case dwarf2reader::DW_AT_inline:
- switch(data) {
- case dwarf2reader::DW_INL_inlined:
- case dwarf2reader::DW_INL_declared_not_inlined:
- case dwarf2reader::DW_INL_declared_inlined:
- inline_ = true; break;
- default:
- break;
- }
- break;
+ // If this attribute is present at all --- even if its value is
+ // DW_INL_not_inlined --- then GCC may cite it as someone else's
+ // DW_AT_abstract_origin attribute.
+ case dwarf2reader::DW_AT_inline: inline_ = true; break;
+
case dwarf2reader::DW_AT_low_pc: low_pc_ = data; break;
case dwarf2reader::DW_AT_high_pc: high_pc_ = data; break;
default:
@@ -350,16 +345,11 @@ void DwarfCUToModule::FuncHandler::ProcessAttributeSigned(
enum DwarfForm form,
int64 data) {
switch (attr) {
- case dwarf2reader::DW_AT_inline:
- switch(data) {
- case dwarf2reader::DW_INL_inlined:
- case dwarf2reader::DW_INL_declared_not_inlined:
- case dwarf2reader::DW_INL_declared_inlined:
- inline_ = true; break;
- default:
- break;
- }
- break;
+ // If this attribute is present at all --- even if its value is
+ // DW_INL_not_inlined --- then GCC may cite it as someone else's
+ // DW_AT_abstract_origin attribute.
+ case dwarf2reader::DW_AT_inline: inline_ = true; break;
+
default:
break;
}
diff --git a/src/common/linux/dwarf_cu_to_module_unittest.cc b/src/common/linux/dwarf_cu_to_module_unittest.cc
index 4e9062cf..7553c533 100644
--- a/src/common/linux/dwarf_cu_to_module_unittest.cc
+++ b/src/common/linux/dwarf_cu_to_module_unittest.cc
@@ -756,6 +756,24 @@ TEST_F(Simple, InlineFunctionSignedAttribute) {
0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL);
}
+// Any DIE with an DW_AT_inline attribute can be cited by
+// DW_AT_abstract_origin attributes --- even if the value of the
+// DW_AT_inline attribute is DW_INL_not_inlined.
+TEST_F(Simple, AbstractOriginNotInlined) {
+ PushLine(0x2805c4531be6ca0eULL, 0x686b52155a8d4d2cULL, "line-file", 6111581);
+
+ StartCU();
+ AbstractInstanceDIE(&root_handler_, 0x93e9cdad52826b39ULL,
+ dwarf2reader::DW_INL_not_inlined, 0, "abstract-instance");
+ DefineInlineInstanceDIE(&root_handler_, "", 0x93e9cdad52826b39ULL,
+ 0x2805c4531be6ca0eULL, 0x686b52155a8d4d2cULL);
+ root_handler_.Finish();
+
+ TestFunctionCount(1);
+ TestFunction(0, "abstract-instance",
+ 0x2805c4531be6ca0eULL, 0x686b52155a8d4d2cULL);
+}
+
TEST_F(Simple, UnknownAbstractOrigin) {
EXPECT_CALL(reporter_, UnknownAbstractOrigin(_, 1ULL)).WillOnce(Return());
PushLine(0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL, "line-file", 75173118);