Ver código fonte

* write the volatile flag for LLVM load/store operations if set

git-svn-id: trunk@35004 -
Jonas Maebe 8 anos atrás
pai
commit
26f9dabf56
1 arquivos alterados com 26 adições e 6 exclusões
  1. 26 6
      compiler/llvm/agllvm.pas

+ 26 - 6
compiler/llvm/agllvm.pas

@@ -28,7 +28,8 @@ interface
     uses
       globtype,globals,systems,
       aasmbase,aasmtai,aasmdata,
-      assemble;
+      assemble,
+      aasmllvm;
 
     type
       TLLVMInstrWriter = class;
@@ -85,6 +86,7 @@ interface
         owner: TLLVMAssember;
         fstr: TSymStr;
 
+        function getopcodestr(hp: taillvm): TSymStr;
         function getopstr(const o:toper; refwithalign: boolean) : TSymStr;
         procedure WriteAsmRegisterAllocationClobbers(list: tasmlist);
       end;
@@ -98,7 +100,7 @@ implementation
       fmodule,verbose,
       objcasm,
       aasmcnst,symconst,symdef,symtable,
-      llvmbase,aasmllvm,itllvm,llvmdef,
+      llvmbase,itllvm,llvmdef,
       cgbase,cgutils,cpubase,llvminfo;
 
     const
@@ -537,7 +539,7 @@ implementation
             opstart:=1;
             if llvmflag_load_getelptr_type in llvmversion_properties[current_settings.llvmversion] then
               begin
-                owner.writer.AsmWrite(llvm_op2str[op]);
+                owner.writer.AsmWrite(getopcodestr(taillvm(hp)));
                 opdone:=true;
                 if nested then
                   owner.writer.AsmWrite(' (')
@@ -578,7 +580,7 @@ implementation
             opstart:=2;
             if llvmflag_call_no_ptr in llvmversion_properties[current_settings.llvmversion] then
               begin
-                owner.writer.AsmWrite(llvm_op2str[op]);
+                owner.writer.AsmWrite(getopcodestr(taillvm(hp)));
                 opdone:=true;
                 tmpstr:=llvmencodetypename(taillvm(hp).oper[2]^.def);
                 if tmpstr[length(tmpstr)]<>'*' then
@@ -627,7 +629,7 @@ implementation
               owner.writer.AsmWrite(getopstr(taillvm(hp).oper[0]^,false)+' = ')
             else
               nested:=true;
-            owner.writer.AsmWrite(llvm_op2str[op]);
+            owner.writer.AsmWrite(getopcodestr(taillvm(hp)));
             if not nested then
               owner.writer.AsmWrite(' ')
             else
@@ -665,7 +667,7 @@ implementation
         begin
           if not opdone then
             begin
-              owner.writer.AsmWrite(llvm_op2str[op]);
+              owner.writer.AsmWrite(getopcodestr(taillvm(hp)));
               if nested then
                 owner.writer.AsmWrite(' (');
             end;
@@ -692,6 +694,24 @@ implementation
     end;
 
 
+  function TLLVMInstrWriter.getopcodestr(hp: taillvm): TSymStr;
+    begin
+      result:=llvm_op2str[hp.llvmopcode];
+      case hp.llvmopcode of
+        la_load:
+          begin
+            if vol_read in hp.oper[2]^.ref^.volatility then
+              result:=result+' volatile';
+          end;
+        la_store:
+          begin
+            if vol_write in hp.oper[3]^.ref^.volatility then
+              result:=result+' volatile';
+          end;
+      end;
+    end;
+
+
 {****************************************************************************}
 {                          LLVM Assembler writer                              }
 {****************************************************************************}