Преглед на файлове

LLVM: don't use type names in ctor/dtor arrays

Workaround for https://github.com/llvm/llvm-project/issues/56809
Jonas Maebe преди 2 години
родител
ревизия
839849085b
променени са 4 файла, в които са добавени 8 реда и са изтрити 3 реда
  1. 2 1
      compiler/llvm/llvmdef.pas
  2. 1 0
      compiler/llvm/nllvmutil.pas
  3. 3 1
      compiler/symconst.pas
  4. 2 1
      compiler/utils/ppuutils/ppudump.pp

+ 2 - 1
compiler/llvm/llvmdef.pas

@@ -502,7 +502,8 @@ implementation
           recorddef :
             begin
               { avoid endlessly recursive definitions }
-              if not(lef_typedecl in flags) then
+              if not(lef_typedecl in flags) and
+                 not(df_llvm_no_typename in def.defoptions) then
                 encodedstr:=encodedstr+llvmtypeidentifier(def)
               else
                 llvmaddencodedabstractrecordtype(trecorddef(def),encodedstr);

+ 1 - 0
compiler/llvm/nllvmutil.pas

@@ -180,6 +180,7 @@ implementation
           itemdef:=llvmgettemprecorddef(fields,C_alignment,
             targetinfos[target_info.system]^.alignment.recordalignmin);
           include(itemdef.defoptions,df_llvm_no_struct_packing);
+          include(itemdef.defoptions,df_llvm_no_typename);
           tcb:=ctai_typedconstbuilder.create([tcalo_new_section]);
           tllvmtai_typedconstbuilder(tcb).appendingdef:=true;
           arraydef:=carraydef.getreusable(itemdef,procdefs.Count);

+ 3 - 1
compiler/symconst.pas

@@ -251,7 +251,9 @@ type
     df_has_global_ref,
     { the def was derived with generic type or const fields so the size
       of the def can not be determined }
-    df_has_generic_fields
+    df_has_generic_fields,
+    {  never use the typename for this type, always expand full definition }
+    df_llvm_no_typename
   );
   tdefoptions=set of tdefoption;
 

+ 2 - 1
compiler/utils/ppuutils/ppudump.pp

@@ -2800,7 +2800,8 @@ const
      (mask:df_llvm_no_struct_packing;  str:'LLVM unpacked struct'),
      (mask:df_internal;       str:'Internal'),
      (mask:df_has_global_ref; str:'Has Global Ref'),
-     (mask:df_has_generic_fields; str:'Has generic fields')
+     (mask:df_has_generic_fields; str:'Has generic fields'),
+     (mask:df_llvm_no_typename; str:'LLVM no typename')
   );
   defstate : array[1..ord(high(tdefstate))] of tdefstateinfo=(
      (mask:ds_vmt_written;           str:'VMT Written'),