Quellcode durchsuchen

LLVM debug info: LLVM 7.0 support

Also defined some llvm flags in a negative way so they can be removed from
later versions rather than added
Jonas Maebe vor 3 Jahren
Ursprung
Commit
fd125b506e
2 geänderte Dateien mit 56 neuen und 31 gelöschten Zeilen
  1. 45 21
      compiler/llvm/dbgllvm.pas
  2. 11 10
      compiler/llvm/llvminfo.pas

+ 45 - 21
compiler/llvm/dbgllvm.pas

@@ -1188,45 +1188,73 @@ implementation
 
     procedure TDebugInfoLLVM.appendprocdef(list:TAsmList; def:tprocdef);
 
-      function getdispflags(is_definition, is_virtual: boolean): TSymStr;
+      procedure adddispflags(dinode: tai_llvmspecialisedmetadatanode; is_definition, is_virtual: boolean);
+        var
+          dispflags: TSymStr;
         begin
-          result:='';
+          if llvmflag_NoDISPFlags in llvmversion_properties[current_settings.llvmversion] then
+            begin
+              dinode.addboolean('isDefinition',is_definition);
+              if is_definition then
+                begin
+                  dinode.addboolean('isLocal: ',
+                    not((po_global in def.procoptions) and
+                     (def.parast.symtablelevel<=normal_function_level))
+                  );
+                end;
+              if is_virtual then
+                begin
+                  if not(po_abstractmethod in def.procoptions) then
+                    dinode.addenum('virtuality','DW_VIRTUALITY_virtual')
+                  else
+                    dinode.addenum('virtuality','DW_VIRTUALITY_pure_virtual');
+                end;
+              exit;
+            end;
+
+          dispflags:='';
           if is_definition then
             begin
-              result:='DISPFlagDefinition';
+              dispflags:='DISPFlagDefinition';
               if not((po_global in def.procoptions) and
                      (def.parast.symtablelevel<=normal_function_level)) then
-                result:=result+'|DISPFlagLocalToUnit';
+                dispflags:=dispflags+'|DISPFlagLocalToUnit';
             end;
 
           if is_virtual then
             begin
-              if result<>'' then
-                result:=result+'|';
+              if dispflags<>'' then
+                dispflags:=dispflags+'|';
               if not(po_abstractmethod in def.procoptions) then
-                result:=result+'DISPFlagVirtual'
+                dispflags:=dispflags+'DISPFlagVirtual'
               else
-                result:=result+'DISPFlagPureVirtual';
+                dispflags:=dispflags+'DISPFlagPureVirtual';
             end
           else
             begin
               { this one will always be a definition, so no need to check
                 whether result is empty }
-              if (llvmflag_DISPFlagMainSubprogram in llvmversion_properties[current_settings.llvmversion]) and
+              if not(llvmflag_NoDISPFlagMainSubprogram in llvmversion_properties[current_settings.llvmversion]) and
                  (def.proctypeoption=potype_proginit) then
-                result:=result+'|DISPFlagMainSubprogram';
+                dispflags:=dispflags+'|DISPFlagMainSubprogram';
             end;
+          if dispflags<>'' then
+            dinode.addenum('spFlags',dispflags);
         end;
 
-      function getdiflags(is_definition: boolean): TSymStr;
+      procedure adddiflags(dinode: tai_llvmspecialisedmetadatanode; is_definition: boolean);
+        var
+          diflags: TSymStr;
         begin
-          if not(llvmflag_DISPFlagMainSubprogram in llvmversion_properties[current_settings.llvmversion]) and
+          if (llvmflag_NoDISPFlagMainSubprogram in llvmversion_properties[current_settings.llvmversion]) and
              (def.proctypeoption=potype_proginit) then
-            result:='DIFlagMainSubprogram'
+            diflags:='DIFlagMainSubprogram'
           else if def.owner.symtabletype in [objectsymtable,recordsymtable] then
-            result:=visibilitydiflag(def.visibility)
+            diflags:=visibilitydiflag(def.visibility)
           else
-            result:='';
+            diflags:='';
+          if diflags<>'' then
+            dinode.addenum('flags',diflags);
         end;
 
       var
@@ -1303,9 +1331,7 @@ implementation
           (([po_abstractmethod, po_virtualmethod, po_overridingmethod]*def.procoptions)<>[]) and
           not is_objc_class_or_protocol(def.struct) and
           not is_objectpascal_helper(def.struct);
-        flags:=getdispflags(in_currentunit,is_virtual);
-        if flags<>'' then
-          dinode.addenum('spFlags',flags);
+        adddispflags(dinode,in_currentunit,is_virtual);
         if is_virtual then
           begin
             { the sizeof(pint) is a bit iffy, since vmtmethodoffset() calculates
@@ -1317,9 +1343,7 @@ implementation
               internalerror(2022043001);
 {$endif}
           end;
-        flags:=getdiflags(in_currentunit);
-        if flags<>'' then
-          dinode.addenum('flags',flags);
+        adddiflags(dinode,in_currentunit);
 
         dinode.addmetadatarefto('unit',fcunode);
         ditypenode:=tai_llvmspecialisedmetadatanode.create(tspecialisedmetadatanodekind.DISubroutineType);

+ 11 - 10
compiler/llvm/llvminfo.pas

@@ -56,7 +56,8 @@ type
      llvmflag_generic_constrained_si64tofp, { supports sitofp for 64 bit signed integers on all targets }
      llvmflag_null_pointer_valid_new,       { new syntax for the null pointer valid attribute: null_pointer_is_valid }
      llvmflag_array_datalocation,           { arrays debug info supports a dataLocation attribute to specify how to obtain the array data based on the array variable }
-     llvmflag_DISPFlagMainSubprogram        { MainSubprogram got moved from DIFlags to DISPFlags }
+     llvmflag_NoDISPFlags,                  { no DI sub program flags, but separate fields }
+     llvmflag_NoDISPFlagMainSubprogram      { MainSubprogram still in DIFlags instead of DISPFlags }
    );
    tllvmversionflags = set of tllvmversionflag;
 
@@ -90,15 +91,15 @@ Const
    llvmversion_properties: array[tllvmversion] of tllvmversionflags =
      (
        { invalid         } [],
-       { llvmver_xc_10_0 } [],
-       { llvmver_xc_10_1 } [],
-       { llvmver_7_0     } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid],
-       { llvmver_7_1     } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid],
-       { llvmver_8_0     } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid],
-       { llvmver_xc_11   } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid],
-       { llvmver_9_0     } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid,llvmflag_constrained_fptrunc_fpext,llvmflag_DISPFlagMainSubprogram],
-       { llvmver_10_0    } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid,llvmflag_constrained_fptrunc_fpext,llvmflag_constrained_fptoi_itofp,llvmflag_DISPFlagMainSubprogram],
-       { llvmver_11_0    } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid_new,llvmflag_constrained_fptrunc_fpext,llvmflag_constrained_fptoi_itofp,llvmflag_array_datalocation,llvmflag_DISPFlagMainSubprogram]
+       { llvmver_xc_10_0 } [llvmflag_NoDISPFlags],
+       { llvmver_xc_10_1 } [llvmflag_NoDISPFlags],
+       { llvmver_7_0     } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid,llvmflag_NoDISPFlags],
+       { llvmver_7_1     } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid,llvmflag_NoDISPFlags],
+       { llvmver_8_0     } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid,llvmflag_NoDISPFlagMainSubprogram],
+       { llvmver_xc_11   } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid,llvmflag_NoDISPFlagMainSubprogram],
+       { llvmver_9_0     } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid,llvmflag_constrained_fptrunc_fpext],
+       { llvmver_10_0    } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid,llvmflag_constrained_fptrunc_fpext,llvmflag_constrained_fptoi_itofp],
+       { llvmver_11_0    } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid_new,llvmflag_constrained_fptrunc_fpext,llvmflag_constrained_fptoi_itofp,llvmflag_array_datalocation]
      );
 
    { Supported optimizations, only used for information }