Hi,

Here is a patch to add size relocation and instruction to obtain object's size 
in i386 target.

Thanks,
Ilya
--
2013-11-15  Ilya Enkovich  <ilya.enkov...@intel.com>

        * config/i386/i386.md (UNSPEC_SIZEOF): New.
        (move_size_reloc_<mode>): New.
        * config/i386/predicates.md (size_relocation): New.
        (x86_64_zext_immediate_operand): Support UNSPEC_SIZEOF.
        * config/i386/i386.c (output_pic_addr_const): Support UNSPEC_SIZEOF.
        (i386_asm_output_addr_const_extra): Likewise.


diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index d581b96..a427c15 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -13809,6 +13809,10 @@ output_pic_addr_const (FILE *file, rtx x, int code)
          machopic_output_function_base_name (file);
          break;
 #endif
+       case UNSPEC_SIZEOF:
+         fputs ("@SIZE", file);
+         break;
+
        default:
          output_operand_lossage ("invalid UNSPEC as operand");
          break;
@@ -15387,6 +15391,11 @@ i386_asm_output_addr_const_extra (FILE *file, rtx x)
       }
       break;
 
+    case UNSPEC_SIZEOF:
+      output_addr_const (file, op);
+      fputs ("@SIZE", file);
+      break;
+
     default:
       return false;
     }
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index e23b3b6..97dd89c 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -79,6 +79,7 @@
   UNSPEC_PLTOFF
   UNSPEC_MACHOPIC_OFFSET
   UNSPEC_PCREL
+  UNSPEC_SIZEOF
 
   ;; Prologue support
   UNSPEC_STACK_ALLOC
@@ -18446,6 +18447,14 @@
   "bndstx\t{%2, %3|%3, %2}"
   [(set_attr "type" "mpxst")])
 
+(define_insn "move_size_reloc_<mode>"
+  [(set (match_operand:SWI48 0 "register_operand" "=r")
+        (match_operand:<MODE> 1 "size_relocation" "Z"))]
+  ""
+{
+  return "mov{<imodesuffix>}\t{%1, %0|%0, %1}";
+})
+
 (include "mmx.md")
 (include "sse.md")
 (include "sync.md")
diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md
index 66ac52f..23231b1 100644
--- a/gcc/config/i386/predicates.md
+++ b/gcc/config/i386/predicates.md
@@ -119,6 +119,15 @@
        (match_test "TARGET_64BIT")
        (match_test "REGNO (op) > BX_REG")))
 
+;; Return true if VALUE is size relocation
+(define_predicate "size_relocation"
+  (match_code "const")
+{
+  return (GET_CODE (op) == CONST
+          && GET_CODE (XEXP (op, 0)) == UNSPEC
+         && XINT (XEXP (op, 0), 1) == UNSPEC_SIZEOF);
+})
+
 ;; Return true if VALUE can be stored in a sign extended immediate field.
 (define_predicate "x86_64_immediate_operand"
   (match_code "const_int,symbol_ref,label_ref,const")
@@ -323,6 +332,13 @@
              return false;
            }
        }
+      else if (GET_CODE (XEXP (op, 0)) == UNSPEC)
+        {
+          if (XINT (XEXP (op, 0), 1) == UNSPEC_SIZEOF
+             && XVECLEN (XEXP (op, 0), 0) == 1
+             && GET_CODE (XVECEXP (XEXP (op, 0), 0, 0)) == SYMBOL_REF)
+           return true;
+        }
       break;
 
     default:

Reply via email to