ソースを参照

llvmdbg: fixed variant fields

They have to be members with a union type, rather than union types
themselves.
Jonas Maebe 3 年 前
コミット
d92bc0e760
1 ファイル変更13 行追加2 行削除
  1. 13 2
      compiler/llvm/dbgllvm.pas

+ 13 - 2
compiler/llvm/dbgllvm.pas

@@ -1195,9 +1195,20 @@ implementation
                   begin
                     { more deeply nested variant }
                     uniondi:=tai_llvmspecialisedmetadatanode.create(tspecialisedmetadatanodekind.DICompositeType);
-                    list.concat(uniondi);
-                    fieldlist.addvalue(llvm_getmetadatareftypedconst(uniondi));
 
+                    fielddi:=tai_llvmspecialisedmetadatanode.create(tspecialisedmetadatanodekind.DIDerivedType);
+                    fielddi.addenum('tag','DW_TAG_member');
+                    fielddi.addmetadatarefto('scope',scope);
+                    try_add_file_metaref(fielddi,field.fileinfo,false);
+                    fielddi.addmetadatarefto('baseType',uniondi);
+                    fielddi.addint64('size',cappedsize-min(field.bitoffset,cappedsize));
+                    bitoffset:=bitoffsetfromvariantstart(field,variantinfolist,cappedsize);
+                    if bitoffset<>0 then
+                      fielddi.addqword('offset',bitoffset);
+                    list.concat(fielddi);
+                    fieldlist.addvalue(llvm_getmetadatareftypedconst(fielddi));
+
+                    list.concat(uniondi);
                     uniondi.addenum('tag','DW_TAG_union_type');
                     uniondi.addmetadatarefto('scope',scope);
                     try_add_file_metaref(uniondi,field.fileinfo,false);