On 10/05/2015 11:53 PM, Ashutosh Pal wrote:
Hi Dwarf Experts,
We have processor architectures that have multiple overlapping address spaces.
Our compiler
tool-chain can map data variables (locals and globals) to these address spaces.
For example:
int GMEMX array1[100]; // allocates to GMEMX
int GMEMY array2[100]; // allocates to GMEMY
void foo() {
vint8 vec1 = init_vec(); // allocates to stack on VMEM
int a = get_element(vec1, 1); // allocates to stack on SMEM
..
}
In the above example, there are 4 overlapping address-spaces (GMEMX, GMEMY,
VMEM and SMEM) each has
one variable mapped to it respectively. To uniquely identify the variable
inside debugging
information, we would like to express the location of variables using a tuple
<address-space-id,
local-address> where the ‘address-space-id’ is an integer uniquely identifying
the address-space,
while ‘local-address’ is an expression that evaluates to an address with-in the
corresponding
address space.
So, we are looking for ways using which the locations of these variables can be
expressed in the
dwarf information. We found two features in the dwarf4 specification, but with
both we see drawbacks:
1.DW_AT_segment: This is an attribute that can be specified on top of variable
dies. We can use this
attribute to encode our ‘address-space-id’ and use it in tandem with
DW_AT_location to describe the
required tuple. But, with this we cannot cover those cases where a variable can
reside in 2
address-spaces in its whole life time; for this, we would need an operator
describing the
address-space-id in the location description itself.
DW_AT_segment was designed to represent i386-style addressing where a memory
address was represented by two pieces, a segment or page address and an offset
within the segment. There are several 16-bit architectures which use similar
schemes to address more physical memory than can be addressed by a
register-sized
pointer. The understanding is that a physical memory address can be
arithmetically
computed from the segment and offset.
There's no need for a segment to be encoded in a location expression with one
of these segmented architectures, since the locations are physical addresses.
While DW_AT_segment might be used to represent an address space id, this is
a bit different concept from a segment base address. In general, a physical
address cannot be computed from an [ASID, address] pair.
I don't think it is made explicit in the DWARF standard, but any issues with
aliasing of addresses, where there are different [segment, offset]
representations
of the same physical address, is something that is defined by the architecture
and there is no specific support for this in DWARF. In the i386, it was easy to
create different [segment, offset] representations for the same physical
address,
but these were similarly easily identified. On other [page, offset]
architectures,
this was less an issue.
2.DW_OP_xderef: The is the only operator that allows encoding an
address-space-id along with an
address. But we see 2 problems in expressing the location of say a local
variable residing on stack
at offset 20 on address-space-id 4:
a. {DW_OP_bregx SP 20} {4} DW_OP_xderef: Evaluating this expression returns the
value of the local
variable and NOT its location.
b.The specification also says that the size of the dereferenced value returned
by DW_OP_xderef
should be less than or equal to the size of the address on the target. While in
our case the
dereferenced values could bigger than the address. This further prohibits us in
applying
DW_OP_stack_value operator on the above expression
DWARF assumes that memory has unique physical addresses which are computable
and which can be used in a computation, for example, to index into an array.
DW_OP_xderef performs the implementation-defined computation to convert a
[segment, offset] pair into a physical memory address. As such, the result
is a single value, limited in size to that of a physical memory address.
Are there other possibilities in the dwarf4 standard that we overlooked for the
above scenarios?
Also, any pointers to where people might have already solved such issues
earlier, would be useful to
have.
One thought is that you expand your concept of address to incorporate
an ASID, rather look at the address as a tuple. For example, if you have a
64-bit address, the top 8 or 16 bits might be the ASID, while the remaining
48 or 56 bits represent an address within that ASID. As long as you do not
have overflow from the address into the ASID, there should be no trouble in
generating location expressions. This doesn't address issues related to
aliasing or overlapping address spaces.
A more comprehensive representation of multiple address spaces, including
the possibility that they might overlap or that a variable might exist in
multiple address spaces at the same time, would seem to require a large number
of changes to DWARF.
--
Michael Eager ea...@eagercon.com
1960 Park Blvd., Palo Alto, CA 94306 650-325-8077
_______________________________________________
Dwarf-Discuss mailing list
Dwarf-Discuss@lists.dwarfstd.org
http://lists.dwarfstd.org/listinfo.cgi/dwarf-discuss-dwarfstd.org