default_type_align: Use type_length_units

Message ID 1528928623-27479-1-git-send-email-simon.marchi@ericsson.com
State New, archived
Headers

Commit Message

Simon Marchi June 13, 2018, 10:23 p.m. UTC
  The type alignment value is returned in 8-bit-bytes instead of target
memory addressable units.  For example, on a target with 16-bit-bytes
where sizeof(int) == 1 (one addressable unit), alignof(int) currently
returns 2.  After, this patch, it returns 1.

gdb/ChangeLog:

	* arch-utils.c (default_type_align): Use type_length_units.
---
 gdb/arch-utils.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
  

Comments

Tom Tromey June 14, 2018, 4:59 p.m. UTC | #1
>>>>> "Simon" == Simon Marchi <simon.marchi@ericsson.com> writes:

Simon> The type alignment value is returned in 8-bit-bytes instead of target
Simon> memory addressable units.  For example, on a target with 16-bit-bytes
Simon> where sizeof(int) == 1 (one addressable unit), alignof(int) currently
Simon> returns 2.  After, this patch, it returns 1.

Simon> 	* arch-utils.c (default_type_align): Use type_length_units.

This certainly is correct according to the comment in gdbtypes.h:

  /* * Return the alignment of the type in target addressable memory
     units.

However, I was curious to know what DWARF specifies, to see whether
dwarf2read was doing this as well.  But DWARF seems pretty silent on
this topic:

  A debugging information entry may have a DW_AT_alignment attribute
  whose value of class constant is a positive, non-zero, integer
  describing the alignment of the entity.

So maybe this is depending on what your compiler does?  I think I did
not really consider this issue too deeply when writing the alignment
support :(

Another possible issue is that gdbtypes.c:type_align uses TYPE_LENGTH in
one spot but I suppose it ought to use type_length_units if this patch
goes in.

Tom
  
Simon Marchi June 14, 2018, 6:25 p.m. UTC | #2
On 2018-06-14 12:59, Tom Tromey wrote:
> This certainly is correct according to the comment in gdbtypes.h:
> 
>   /* * Return the alignment of the type in target addressable memory
>      units.
> 
> However, I was curious to know what DWARF specifies, to see whether
> dwarf2read was doing this as well.  But DWARF seems pretty silent on
> this topic:
> 
>   A debugging information entry may have a DW_AT_alignment attribute
>   whose value of class constant is a positive, non-zero, integer
>   describing the alignment of the entity.
> 
> So maybe this is depending on what your compiler does?  I think I did
> not really consider this issue too deeply when writing the alignment
> support :(

 From what I remember, nothing is well defined in DWARF regarding 
non-8-bit-bytes.  In the past, I have contributed fixes for such 
architectures based on how things work with our (Ericsson) internal 
compiler, and nobody complained so far.  There is a BoF at Cauldron 
though to talk about how to make the non-8-bit-bytes support more 
"official" and testable [1], if you're interested!

Our compiler doesn't emit DW_AT_alignment AFAIK, so I don't know what it 
would emit.  But it would make sense if it was in addressable memory 
units, just like type sizes.

> Another possible issue is that gdbtypes.c:type_align uses TYPE_LENGTH 
> in
> one spot but I suppose it ought to use type_length_units if this patch
> goes in.

This use seems related to C++, and our compiler is C only, so I can't 
test that.  But it would make sense, I can include that change if you 
prefer.

Simon

[1] 
https://gcc.gnu.org/wiki/cauldron2018#Non-8-bit-byte_architecture_support_BoF
  
Tom Tromey June 14, 2018, 7:50 p.m. UTC | #3
>>>>> "Simon" == Simon Marchi <simon.marchi@polymtl.ca> writes:

Simon> This use seems related to C++, and our compiler is C only, so I can't
Simon> test that.  But it would make sense, I can include that change if you
Simon> prefer.

Yeah, I think it would be best to either change both or change neither
(and update the comment).

Tom
  

Patch

diff --git a/gdb/arch-utils.c b/gdb/arch-utils.c
index 76bc16f..a65f01f 100644
--- a/gdb/arch-utils.c
+++ b/gdb/arch-utils.c
@@ -994,7 +994,7 @@  default_in_indirect_branch_thunk (gdbarch *gdbarch, CORE_ADDR pc)
 ULONGEST
 default_type_align (struct gdbarch *gdbarch, struct type *type)
 {
-  return TYPE_LENGTH (check_typedef (type));
+  return type_length_units (check_typedef (type));
 }
 
 void