Fix DW_AT_specification handling in DWO files

Summary:
We were trying to get a DWARFDIE from a CompileUnit belonging to a DWO file. However, this
function does not understand the die encoding used by the DWO files. Instead use GetDIE on the
SymbolFileDWARF, which is overriden in DWO to do the right thing.

Reviewers: clayborg, tberghammer

Subscribers: lldb-commits, ovyalov

Differential Revision: http://reviews.llvm.org/D19927

llvm-svn: 268615
This commit is contained in:
Pavel Labath 2016-05-05 08:21:44 +00:00
parent 41fe4bacf5
commit b9436bd493
6 changed files with 71 additions and 1 deletions

View File

@ -0,0 +1,5 @@
LEVEL = ../../../make
CXX_SOURCES := file1.cpp file2.cpp
include $(LEVEL)/Makefile.rules

View File

@ -0,0 +1,35 @@
"""
Test SBSymbolContext APIs.
"""
from __future__ import print_function
import os
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
class SymbolContextTwoFilesTestCase(TestBase):
mydir = TestBase.compute_mydir(__file__)
@add_test_categories(['pyapi'])
def test_lookup_by_address(self):
"""Test lookup by address in a module with multiple compilation units"""
self.build()
exe = os.path.join(os.getcwd(), "a.out")
target = self.dbg.CreateTarget(exe)
self.assertTrue(target, VALID_TARGET)
module = target.GetModuleAtIndex(0)
self.assertTrue(module.IsValid())
for symbol_name in ["struct1::f()", "struct2::f()"]:
sc_list = module.FindFunctions(symbol_name, lldb.eSymbolTypeCode)
self.assertTrue(1, sc_list.GetSize())
symbol_address = sc_list.GetContextAtIndex(0).GetSymbol().GetStartAddress()
self.assertTrue(symbol_address.IsValid())
sc_by_address = module.ResolveSymbolContextForAddress(symbol_address, lldb.eSymbolContextFunction)
self.assertEqual(symbol_name, sc_by_address.GetFunction().GetName())

View File

@ -0,0 +1,11 @@
struct struct1
{
static void
f();
};
struct struct2
{
static void
f();
};

View File

@ -0,0 +1,13 @@
#include "decls.h"
void
struct1::f()
{
}
int main()
{
struct1::f();
struct2::f();
return 0;
}

View File

@ -0,0 +1,6 @@
#include "decls.h"
void
struct2::f()
{
}

View File

@ -610,7 +610,7 @@ DWARFDebugInfoEntry::GetDIENamesAndRanges
{
if (die_ref.die_offset != DW_INVALID_OFFSET)
{
DWARFDIE die = dwarf2Data->DebugInfo()->GetDIE(die_ref);
DWARFDIE die = dwarf2Data->GetDIE(die_ref);
if (die)
die.GetDIE()->GetDIENamesAndRanges(die.GetDWARF(), die.GetCU(), name, mangled, ranges, decl_file, decl_line, decl_column, call_file, call_line, call_column);
}