This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: MIPS64 -msym32 and DWARF2_ADDR_SIZE


Adam Nemet <anemet@caviumnetworks.com> writes:
> -msym32 changes DWARF's address_size from 64 bits to 32 bits.  This means that
> while symbols are 64-bit (due to ELF64), target addresses in the debug info
> are 32-bit.
>
> There is support for this in DWARF of course in fact you can specify different
> address_size for each compilation unit which nicely maps with -msym32 being
> link-compatible with regular N64 objects.
>
> However, this asymmetry exposed several bugs in binutils.  Also, as I just
> discovered today, dwarfdump (libdwarf) has no support for changing the
> address_size between compilation units and in fact derives address_size from
> the ELF class (ELF64/ELF32).  (Obviously, that's a bug in libdwarf.)

Good catch.

> So my question is whether the saving in the size of the debug info with
> -msym32 is really worth the trouble here or should we just start generating
> 64-bit addresses with -msym32?

Generating 64-bit addresses would be fine with me FWIW.  I'm not sure
the current behaviour is exactly deliberate; it was probably just
something I overlooked when adding -msym32.

How about the patch below?  I'll apply it in the next couple of days
if there are no objections.

Richard


gcc/
	* config/mips/mips.h (FILE_HAS_64BIT_SYMBOLS): New macro.
	(ABI_HAS_64BIT_SYMBOLS): Use it.
	(DWARF2_ADDR_SIZE): Use it instead of ABI_HAS_64BIT_SYMBOLS.

Index: gcc/config/mips/mips.h
===================================================================
--- gcc/config/mips/mips.h	2009-01-31 12:21:01.000000000 +0000
+++ gcc/config/mips/mips.h	2009-01-31 12:38:03.000000000 +0000
@@ -767,9 +767,15 @@ #define ABI_NEEDS_64BIT_REGS	(TARGET_NEW
 /* Likewise for 32-bit regs.  */
 #define ABI_NEEDS_32BIT_REGS	(mips_abi == ABI_32)
 
-/* True if symbols are 64 bits wide.  At present, n64 is the only
-   ABI for which this is true.  */
-#define ABI_HAS_64BIT_SYMBOLS	(mips_abi == ABI_64 && !TARGET_SYM32)
+/* True if the file format uses 64-bit symbols.  At present, this is
+   only true for n64, which uses 64-bit ELF.  */
+#define FILE_HAS_64BIT_SYMBOLS	(mips_abi == ABI_64)
+
+/* True if symbols are 64 bits wide.  This is usually determined by
+   the ABI's file format, but it can be overridden by -msym32.  Note that
+   overriding the size with -msym32 changes the ABI of relocatable objects,
+   although it doesn't change the ABI of a fully-linked object.  */
+#define ABI_HAS_64BIT_SYMBOLS	(FILE_HAS_64BIT_SYMBOLS && !TARGET_SYM32)
 
 /* ISA has instructions for managing 64-bit fp and gp regs (e.g. mips3).  */
 #define ISA_HAS_64BIT_REGS	(ISA_MIPS3				\
@@ -1218,7 +1224,14 @@ #define DWARF2_DEBUGGING_INFO 1         
 #define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
 #endif
 
-#define DWARF2_ADDR_SIZE (ABI_HAS_64BIT_SYMBOLS ? 8 : 4)
+/* The size of DWARF addresses should be the same as the size of symbols
+   in the target file format.  They shouldn't depend on things like -msym32,
+   because many DWARF consumers do not allow the mixture of address sizes
+   that one would then get from linking -msym32 code with -msym64 code.
+
+   Note that the default POINTER_SIZE test is not appropriate for MIPS.
+   EABI64 has 64-bit pointers but uses 32-bit ELF.  */
+#define DWARF2_ADDR_SIZE (FILE_HAS_64BIT_SYMBOLS ? 8 : 4)
 
 /* By default, turn on GDB extensions.  */
 #define DEFAULT_GDB_EXTENSIONS 1


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]