JIT: handle byref-typed immediates in encoding (dotnet/coreclr#21477)
authorAndy Ayers <andya@microsoft.com>
Thu, 13 Dec 2018 00:54:08 +0000 (16:54 -0800)
committerGitHub <noreply@github.com>
Thu, 13 Dec 2018 00:54:08 +0000 (16:54 -0800)
We may now retype some immediates (for instance RVA statics feeding into Spans)
as byrefs.  These need to be tracked as such during encoding so that the encoder
GC liveness tracking stays current.

Fixes the assert seen in dotnet/coreclr#21466.

Commit migrated from https://github.com/dotnet/coreclr/commit/962b1737249adcbf6eea9388463a042e4dc19288

src/coreclr/src/jit/codegenxarch.cpp

index f63fe14..cf9055c 100644 (file)
@@ -420,7 +420,13 @@ void CodeGen::instGen_Set_Reg_To_Imm(emitAttr size, regNumber reg, ssize_t imm,
     {
         if (genDataIndirAddrCanBeEncodedAsPCRelOffset(imm))
         {
-            getEmitter()->emitIns_R_AI(INS_lea, EA_PTR_DSP_RELOC, reg, imm);
+            emitAttr newSize = EA_PTR_DSP_RELOC;
+            if (EA_IS_BYREF(size))
+            {
+                newSize = EA_SET_FLG(newSize, EA_BYREF_FLG);
+            }
+
+            getEmitter()->emitIns_R_AI(INS_lea, newSize, reg, imm);
         }
         else
         {
@@ -449,7 +455,14 @@ void CodeGen::genSetRegToConst(regNumber targetReg, var_types targetType, GenTre
 
             if (con->ImmedValNeedsReloc(compiler))
             {
-                instGen_Set_Reg_To_Imm(EA_HANDLE_CNS_RELOC, targetReg, cnsVal);
+                emitAttr size = EA_HANDLE_CNS_RELOC;
+
+                if (targetType == TYP_BYREF)
+                {
+                    size = EA_SET_FLG(size, EA_BYREF_FLG);
+                }
+
+                instGen_Set_Reg_To_Imm(size, targetReg, cnsVal);
                 regSet.verifyRegUsed(targetReg);
             }
             else