From bae6ca6883d84aff6c9061af6ddf35a7766b51b4 Mon Sep 17 00:00:00 2001 From: florian Date: Mon, 22 Mar 2021 18:11:41 +0000 Subject: [PATCH] * Dwarf: write variant fields only if the require features are present, resolves #38651 git-svn-id: trunk@49032 - --- compiler/dbgdwarf.pas | 88 +++++++++++++++++++++++-------------------- 1 file changed, 48 insertions(+), 40 deletions(-) diff --git a/compiler/dbgdwarf.pas b/compiler/dbgdwarf.pas index 93843d22ee..6ae674b84e 100644 --- a/compiler/dbgdwarf.pas +++ b/compiler/dbgdwarf.pas @@ -4609,34 +4609,39 @@ implementation procedure TDebugInfoDwarf3.appenddef_variant(list:TAsmList;def: tvariantdef); const - VARIANTS: array[1..27] of record Value: Word; Name: String end = ( - (value:0; name:''), - (value:1; name:''), - (value:2; name:'VSMALLINT'), - (value:3; name:'VINTEGER'), - (value:4; name:'VSINGLE'), - (value:5; name:'VDOUBLE'), - (value:6; name:'VCURRENCY'), - (value:7; name:'VDATE'), - (value:8; name:'VOLESTR'), - (value:9; name:'VDISPATCH'), - (value:10; name:'VERROR'), - (value:11; name:'VBOOLEAN'), - (value:12; name:''), - (value:13; name:'VUNKNOWN'), - (value:14; name:''), - (value:16; name:'VSHORTINT'), - (value:17; name:'VBYTE'), - (value:18; name:'VWORD'), - (value:19; name:'VLONGWORD'), - (value:20; name:'VINT64'), - (value:21; name:'VQWORD'), - (value:36; name:'VRECORD'), - (value:$48; name:''), - (value:$100; name:'VSTRING'), - (value:$101; name:'VANY'), - (value:$2000; name:'VARRAY'), - (value:$4000; name:'VPOINTER') + VARIANTS: array[1..27] of record + Value: Word; + Name: String; + { some fields are only supported by some features } + features : tfeatures + end = ( + (value:0; name:'';features: []), + (value:1; name:'';features: []), + (value:2; name:'VSMALLINT';features: []), + (value:3; name:'VINTEGER';features: []), + (value:4; name:'VSINGLE';features: [f_softfpu]), + (value:5; name:'VDOUBLE';features: [f_softfpu]), + (value:6; name:'VCURRENCY';features: [f_softfpu]), + (value:7; name:'VDATE';features: [f_softfpu]), + (value:8; name:'VOLESTR';features: []), + (value:9; name:'VDISPATCH';features: []), + (value:10; name:'VERROR';features: []), + (value:11; name:'VBOOLEAN';features: []), + (value:12; name:'';features: []), + (value:13; name:'VUNKNOWN';features: []), + (value:14; name:'';features: []), + (value:16; name:'VSHORTINT';features: []), + (value:17; name:'VBYTE';features: []), + (value:18; name:'VWORD';features: []), + (value:19; name:'VLONGWORD';features: []), + (value:20; name:'VINT64';features: []), + (value:21; name:'VQWORD';features: []), + (value:36; name:'VRECORD';features: []), + (value:$48; name:'';features: []), + (value:$100; name:'VSTRING';features: []), + (value:$101; name:'VANY';features: []), + (value:$2000; name:'VARRAY';features: []), + (value:$4000; name:'VPOINTER';features: []) ); var fs: tfieldvarsym; @@ -4669,20 +4674,23 @@ implementation { variants } for idx := Low(VARIANTS) to High(VARIANTS) do begin - append_entry(DW_TAG_variant,true,[ - DW_AT_discr_value,DW_FORM_udata,VARIANTS[idx].value - ]); - finish_entry; - - if VARIANTS[idx].name <> '' then + if (features*VARIANTS[idx].features)=VARIANTS[idx].features then begin - fs := tfieldvarsym(vardatadef.symtable.Find(VARIANTS[idx].name)); - if (fs = nil) or (fs.typ <> fieldvarsym) then - internalerror(20060927200+idx); - appendsym_fieldvar(list,fs); - end; + append_entry(DW_TAG_variant,true,[ + DW_AT_discr_value,DW_FORM_udata,VARIANTS[idx].value + ]); + finish_entry; - finish_children; { variant } + if VARIANTS[idx].name <> '' then + begin + fs := tfieldvarsym(vardatadef.symtable.Find(VARIANTS[idx].name)); + if (fs = nil) or (fs.typ <> fieldvarsym) then + internalerror(2006092702+idx); + appendsym_fieldvar(list,fs); + end; + + finish_children; { variant } + end; end;