+2017-06-01 Pierre-Marie de Rodat <derodat@adacore.com>
+
+ * dwarf2out.c (get_discr_value): Call the get_debug_type hook on
+ the type of the input discriminant value. Convert the
+ discriminant value of signedness vary.
+
2017-06-01 Volker Reichelt <v.reichelt@netcologne.de>
* doc/invoke.texi (-Wcatch-value): Document new shortcut.
static bool
get_discr_value (tree src, dw_discr_value *dest)
{
- bool is_unsigned = TYPE_UNSIGNED (TREE_TYPE (src));
+ tree discr_type = TREE_TYPE (src);
- if (TREE_CODE (src) != INTEGER_CST
- || !(is_unsigned ? tree_fits_uhwi_p (src) : tree_fits_shwi_p (src)))
+ if (lang_hooks.types.get_debug_type)
+ {
+ tree debug_type = lang_hooks.types.get_debug_type (discr_type);
+ if (debug_type != NULL)
+ discr_type = debug_type;
+ }
+
+ if (TREE_CODE (src) != INTEGER_CST || !INTEGRAL_TYPE_P (discr_type))
+ return false;
+
+ /* Signedness can vary between the original type and the debug type. This
+ can happen for character types in Ada for instance: the character type
+ used for code generation can be signed, to be compatible with the C one,
+ but from a debugger point of view, it must be unsigned. */
+ bool is_orig_unsigned = TYPE_UNSIGNED (TREE_TYPE (src));
+ bool is_debug_unsigned = TYPE_UNSIGNED (discr_type);
+
+ if (is_orig_unsigned != is_debug_unsigned)
+ src = fold_convert (discr_type, src);
+
+ if (!(is_debug_unsigned ? tree_fits_uhwi_p (src) : tree_fits_shwi_p (src)))
return false;
- dest->pos = is_unsigned;
- if (is_unsigned)
+ dest->pos = is_debug_unsigned;
+ if (is_debug_unsigned)
dest->v.uval = tree_to_uhwi (src);
else
dest->v.sval = tree_to_shwi (src);
--- /dev/null
+-- { dg-options "-cargs -O0 -g -dA -fgnat-encodings=minimal -margs" }
+--
+-- This testcase checks that in the DWARF description of the variant type
+-- below, the C discriminant is properly described as unsigned, hence the 0x5a
+-- ('Z') and 0x80 (128) values in the DW_AT_discr_list attribute. If it was
+-- described as signed, we would have instead 90 and -128.
+--
+-- { dg-final { scan-assembler-times "0x5a.*DW_AT_discr_list" 1 } }
+-- { dg-final { scan-assembler-times "0x80.*DW_AT_discr_list" 1 } }
+
+with Ada.Text_IO;
+
+procedure Debug11 is
+ type Rec_Type (C : Character) is record
+ case C is
+ when 'Z' .. Character'Val (128) => I : Integer;
+ when others => null;
+ end case;
+ end record;
+ -- R : Rec_Type := ('Z', 2);
+ R : Rec_Type ('Z');
+begin
+ R.I := 0;
+ Ada.Text_IO.Put_Line ("" & R.C);
+end Debug11;