[Spec] DWARF2

[From DWARF Specification Version 2.0]

* Ambiguity in the Spec.
At first, let’s see followings.

[Extracted from spec. page 66]
DW_CFA_def_cfa_offset takes a single unsigned LEB128 argument representing an offset — (*1). The required action is to define the current CFA rule to use the provided offset (but to keep the old register).

[Extracted from spec. page 105]
fde + 17 DW_CFA_def_cfa_offset (<fsize>/4) — (*2) ; assuming <fsize> < 512

As you can see above, in (*1) argument is just an offset. But in (*2), <fsize> is divided by ‘4’. So, I think there is conflict in those part.

In ‘libdwarf’, as (*1), it uses offset value itself. But, dwarf information generated by ADS1.2 compiler is obeys rule (*2) – offset * 4 (data alignment factor).

* How can we get Die from PC without ‘Arrange Section’.

In this case, we can get CU Die from CU Header. And then, the result of sorting them into ‘lowpc’ order, can be used.

* Optimizing out local stack variable.

Unlike static or global variable, dwarf defines valid range for the local stack variable. That is, stack variable is valid only in this range. This may make mismatch between code and dwarf information; Sometimes, we seem to know value of variable when we look at the code, but in actual dwarf information, the variable is not valid yet, or optimized out. So, we cannot know it. Yes, this is totally compiler dependent.

Here is example.

    int a = 8;
    a = 10;   // --- (*)

“int a=8” is stored at NVRAM. So, compiler don’t need to keep this value in memory. Therefore, before “a=10;”, this value may not be assigned into the stack – that is, there is not relative dwarf information. As a result, we cannot read value “a” by reading register of memory. (In practice, this kind of stuffs often happens in ADS1.2 compiler.)

* Handling included source.
See follows.


    #include "a.c"

(ASSUMPTION : ‘a.c’ is not compiled separately)

In ADS1.2, 10th line of ‘a.c’ is regarded as 10th line of ‘b.c’. So, there are two 10th lines in the dwarf information. I think some compiler may handle this case correctly. But, in ADS1.2, dwarf information is generated unexpectedly.