Hi Andrew, I agree that the language could be tidied up here, but I'm confident that a lookup of the "containing scope" ought to start with the DIE itself. Normally any DIE describing a code entity (function, lexical block, unit) would itself have a low_pc/high_pc pair or DW_AT_ranges; if it doesn't, you look up the parent chain (the "containing scopes") to find the first DIE with a code range. But you knew that.
If the entry_pc is a constant, then it's an offset from the lowest address in the range that you find that way. If the entry_pc is omitted, then it's the lowest address in the range that you find that way (equivalent to constant zero). Hope this helps, --paulr On Thu, Oct 10, 2024 at 6:28 AM Andrew Burgess via Dwarf-discuss < dwarf-discuss@lists.dwarfstd.org> wrote: > > I'd like to ask for some clarification relating to DW_AT_entry_pc. Here > is the relevant section from the DWARF-5 spec for reference: > > > 2.18 Entry Address > > The entry or first executable instruction generated for an entity, if > applicable, is often the lowest addressed instruction of a contiguous > range of instructions. In other cases, the entry address needs to be > specified explicitly. Any debugging information entry describing an > entity that has a range of code addresses, which includes compilation > units, module initialization, subroutines, lexical blocks, try/catch > blocks, and the like, may have a DW_AT_entry_pc attribute to indicate > the entry address which is the address of the instruction where > execution begins within that range of addresses. If the value of the > DW_AT_entry_pc attribute is of class address that address is the entry > address; or, if it is of class constant, the value is an unsigned > integer offset which, when added to the base address of the function, > gives the entry address. > > If no DW_AT_entry_pc attribute is present, then the entry address is > assumed to be the same as the base address of the containing scope. > > I am slightly confused by two parts of this. First, this: > > "...if it is of class constant, the value is an unsigned integer > offset which, when added to the base address of the function, gives > the entry address." > > What does 'of the function' mean in this context? I wonder if this > possibly means the base address of the DIE which contains the > DW_AT_entry_pc itself? Or should I be looking up the DIE hierarchy some > specific DIE type? > > Next this: > > "If no DW_AT_entry_pc attribute is present, then the entry address is > assumed to be the same as the base address of the containing scope." > > My very literal reading of this is that "containing scope" must be the > DIE which contains the DIE which is missing the DW_AT_entry_pc, i.e. the > parent of the DIE we are currently looking at. I got there because > DW_AT_entry_pc is missing, so nothing contains it. Therefore the only > thing that can be contained is the DIE we are currently considering. > > However, I suspect this might not be the intended meaning. My less > literal interpretation is that we should use the base address of the DIE > which is missing the DW_AT_entry_pc. > > Any guidance is gratefully received. > > Thanks, > Andrew > > -- > Dwarf-discuss mailing list > Dwarf-discuss@lists.dwarfstd.org > https://lists.dwarfstd.org/mailman/listinfo/dwarf-discuss >
-- Dwarf-discuss mailing list Dwarf-discuss@lists.dwarfstd.org https://lists.dwarfstd.org/mailman/listinfo/dwarf-discuss