瀏覽代碼

+ handle LOC_FLAGS in thlcgobj.location_force_mem, resolves #39292

florian 3 年之前
父節點
當前提交
5afd809e88
共有 2 個文件被更改,包括 32 次插入0 次删除
  1. 13 0
      compiler/hlcgobj.pas
  2. 19 0
      tests/webtbs/tw39292.pp

+ 13 - 0
compiler/hlcgobj.pas

@@ -4267,6 +4267,7 @@ implementation
     var
     var
       r : treference;
       r : treference;
       forcesize: aint;
       forcesize: aint;
+      hregister: TRegister;
     begin
     begin
       case l.loc of
       case l.loc of
         LOC_FPUREGISTER,
         LOC_FPUREGISTER,
@@ -4288,6 +4289,18 @@ implementation
             location_reset_ref(l,LOC_REFERENCE,l.size,size.alignment,[]);
             location_reset_ref(l,LOC_REFERENCE,l.size,size.alignment,[]);
             l.reference:=r;
             l.reference:=r;
           end;
           end;
+{$ifdef cpuflags}
+        LOC_FLAGS :
+          begin
+            hregister:=getregisterfordef(list,size);
+            g_flags2reg(list,size,l.resflags,hregister);
+            cg.a_reg_dealloc(list,NR_DEFAULTFLAGS);
+            tg.gethltemp(list,size,size.size,tt_normal,r);
+            a_load_reg_ref(list,size,size,hregister,r);
+            location_reset_ref(l,LOC_REFERENCE,l.size,size.alignment,[]);
+            l.reference:=r;
+          end;
+{$endif cpuflags}
         LOC_CONSTANT,
         LOC_CONSTANT,
         LOC_REGISTER,
         LOC_REGISTER,
         LOC_CREGISTER,
         LOC_CREGISTER,

+ 19 - 0
tests/webtbs/tw39292.pp

@@ -0,0 +1,19 @@
+{$mode objfpc} {$modeswitch typehelpers}
+type
+	BoolHelper = type helper for boolean
+		function ToChar: char;
+	end;
+
+	function BoolHelper.ToChar: char;
+	begin
+		result := pChar('-+')[ord(self)];
+	end;
+
+var
+	x: uint32;
+
+begin
+	writeln((@x = @x).ToChar);
+    if (@x = @x).ToChar<>'+' then
+      halt(1);
+end.