[lldb-dev] ASSERT when building record layout for anonymous structures.

Thirumurthi, Ashok ashok.thirumurthi at intel.com
Thu Apr 18 14:18:59 PDT 2013

Hi Samuel,

In the attached patch, I redefined z as a struct variable and added a test for "p z" that does trigger the assert below.  I believe this is already captured by http://llvm.org/bugs/show_bug.cgi?id=15036, so I cross-referenced the failure accordingly.

I also added a passing test to cover the error path when trying to deference a null pointer to a struct (*pz in the attached patch), and a passing test for "p z.y" so we have some test coverage.

In general, the assert occurs because lldb fails to generate the external AST layout that clang expects while parsing the DIE tree.  This could have to do with the order in which the DIE tree is parsed.  The attached tests also exercise different nests of anonymous structs and break variously with clang, gcc and icc.  I've commented on bugzilla 15036 which mentioned other related failures.

I expect that some of these tests will fail on Darwin as well.  Again, the test case is much appreciated,

- Ashok

-----Original Message-----
From: lldb-dev-bounces at cs.uiuc.edu [mailto:lldb-dev-bounces at cs.uiuc.edu] On Behalf Of Malea, Daniel
Sent: Tuesday, April 16, 2013 5:59 PM
To: Samuel Jacob; lldb-dev
Subject: Re: [lldb-dev] ASSERT when building record layout for anonymous structures.

Are you on the trunk revision? I'm unable to reproduce your crash (although I do recall seeing a crash like that a few months ago). Here's what I see:

(lldb) p *((type_z*)0)
error: Couldn't dematerialize struct : Couldn't read a composite type from the target: Input/output error Errored out in Execute: Couldn't FinalizeJITExpression

Which makes sense, although the error message is not too user friendly, the phrase 'couldn't read a composite type from the target' implies the pointer was not dereferenced properly.

BTW, I am using GCC 4.7.2 (from Ubuntu 12.10)


On 2013-04-16 5:33 PM, "Samuel Jacob" <samueldotj at gmail.com> wrote:

>lldb asserts when inspecting a simple structure.
>Here is the simple test case. I already filed a bug 
>In my project a main base structure has anonymous field which makes 
>lldb unusable(since it asserts for any structure access). Can somebody 
>please take a look at this bug?
>$ cat test.c
>typedef struct {
>    int dummy;
>typedef struct {
>    type_y y;
>int main(int argc, char *argv[])
>    type_z *z = 0;
>    return 0;
>$ gcc -O0 -g3 ./test.c
>$ lldb a.out
>Current executable set to 'a.out' (x86_64).
>(lldb) p *((type_z *)0)
>lldb: llvm/tools/clang/lib/AST/RecordLayoutBuilder.cpp:2271: uint64_t 
>clang::FieldDecl *, uint64_t): Assertion
>`ExternalFieldOffsets.find(Field) != ExternalFieldOffsets.end() && 
>"Field does not have an external offset"' failed.
>lldb-dev mailing list
>lldb-dev at cs.uiuc.edu

lldb-dev mailing list
lldb-dev at cs.uiuc.edu
-------------- next part --------------
A non-text attachment was scrubbed...
Name: test-anonymous.patch
Type: application/octet-stream
Size: 6687 bytes
Desc: test-anonymous.patch
URL: <http://lists.llvm.org/pipermail/lldb-dev/attachments/20130418/e05dc7cd/attachment.obj>

More information about the lldb-dev mailing list