I've committed this to dmalcolm/jit:

Replace various accessors to primitive types
(gcc_jit_context_get_char_type etc) with a single entrypoint
gcc_jit_context_get_type that takes an enum.

Add two other new entrypoints:

  /* Floating-point constants.  */
  extern gcc_jit_rvalue *
  gcc_jit_context_new_rvalue_from_double (gcc_jit_context *ctxt,
                                          gcc_jit_type *type,
                                          double value);

  /* Pointers.  */
  extern gcc_jit_rvalue *
  gcc_jit_context_new_rvalue_from_ptr (gcc_jit_context *ctxt,
                                       gcc_jit_type *type,
                                       void *value);

Add test-types.c to exercise the above.

gcc/jit/

        * internal-api.c (gcc::jit::context::get_void_type): Remove.
        (gcc::jit::context::get_char_type): Remove.
        (gcc::jit::context::get_int_type): Remove.
        (gcc::jit::context::get_float_type): Remove.
        (gcc::jit::context::get_double_type): Remove.
        (get_tree_node_for_type): New.
        (gcc::jit::context::get_type): New.
        (gcc::jit::context::new_rvalue_from_double): New.
        (gcc::jit::context::new_rvalue_from_ptr): New.
        * internal-api.h (gcc::jit::context::get_void_type): Remove.
        (gcc::jit::context::get_char_type): Remove.
        (gcc::jit::context::get_int_type): Remove.
        (gcc::jit::context::get_float_type): Remove.
        (gcc::jit::context::get_double_type): Remove.
        (gcc::jit::context::get_type): New.
        (gcc::jit::context::new_rvalue_from_double): New.
        (gcc::jit::context::new_rvalue_from_ptr): New.
        * libgccjit.c (gcc_jit_context_get_void_type): Remove.
        (gcc_jit_context_get_char_type): Remove.
        (gcc_jit_context_get_int_type): Remove.
        (gcc_jit_context_get_float_type): Remove.
        (gcc_jit_context_get_double_type): Remove.
        (gcc_jit_context_get_type): New.
        (gcc_jit_context_new_rvalue_from_double): New.
        (gcc_jit_context_new_rvalue_from_ptr): New.
        * libgccjit.h (gcc_jit_context_get_void_type): Remove.
        (gcc_jit_context_get_char_type): Remove.
        (gcc_jit_context_get_int_type): Remove.
        (gcc_jit_context_get_float_type): Remove.
        (gcc_jit_context_get_double_type): Remove.
        (enum gcc_jit_types): New.
        (gcc_jit_context_get_type): New.
        (gcc_jit_context_new_rvalue_from_double): New.
        (gcc_jit_context_new_rvalue_from_ptr): New.
        * libgccjit.map (gcc_jit_context_get_void_type): Remove.
        (gcc_jit_context_get_char_type): Remove.
        (gcc_jit_context_get_int_type): Remove.
        (gcc_jit_context_get_float_type): Remove.
        (gcc_jit_context_get_double_type): Remove.
        (enum gcc_jit_types): New.
        (gcc_jit_context_get_type): New.
        (gcc_jit_context_new_rvalue_from_double): New.
        (gcc_jit_context_new_rvalue_from_ptr): New.
        * TODO.rst ("access to more primitive types"): Remove
        completed item.

gcc/testsuite/
        * jit.dg/test-accessing-struct.c (code_making_callback): Update
        for changes to type API.
        * jit.dg/test-calling-external-function.c (code_making_callback):
        Likewise.
        * jit.dg/test-dot-product.c (code_making_callback): Likewise.
        * jit.dg/test-factorial.c (code_making_callback): Likewise.
        * jit.dg/test-fibonacci.c (code_making_callback): Likewise.
        * jit.dg/test-hello-world.c (code_making_callback): Likewise.
        * jit.dg/test-string-literal.c (code_making_callback): Likewise.
        * jit.dg/test-sum-of-squares.c (code_making_callback): Likewise.
        * jit.dg/test-using-globals.c (code_making_callback): Likewise.
        * jit.dg/test-types.c: New.
        * jit.dg/test-combination.c (code_making_callback): Use code
        from test-types.c.
        (verify_code): ...and verify it.
---
 gcc/jit/ChangeLog.jit                              |  48 ++++
 gcc/jit/TODO.rst                                   |  11 -
 gcc/jit/internal-api.c                             | 130 ++++++++--
 gcc/jit/internal-api.h                             |  22 +-
 gcc/jit/libgccjit.c                                |  49 ++--
 gcc/jit/libgccjit.h                                |  67 ++++-
 gcc/jit/libgccjit.map                              |   8 +-
 gcc/testsuite/ChangeLog.jit                        |  18 ++
 gcc/testsuite/jit.dg/test-accessing-struct.c       |   6 +-
 .../jit.dg/test-calling-external-function.c        |   6 +-
 gcc/testsuite/jit.dg/test-combination.c            |   9 +
 gcc/testsuite/jit.dg/test-dot-product.c            |   6 +-
 gcc/testsuite/jit.dg/test-factorial.c              |   3 +-
 gcc/testsuite/jit.dg/test-fibonacci.c              |   3 +-
 gcc/testsuite/jit.dg/test-hello-world.c            |  17 +-
 gcc/testsuite/jit.dg/test-string-literal.c         |   3 +-
 gcc/testsuite/jit.dg/test-sum-of-squares.c         |   3 +-
 gcc/testsuite/jit.dg/test-types.c                  | 287 +++++++++++++++++++++
 gcc/testsuite/jit.dg/test-using-global.c           |   6 +-
 19 files changed, 588 insertions(+), 114 deletions(-)
 create mode 100644 gcc/testsuite/jit.dg/test-types.c

diff --git a/gcc/jit/ChangeLog.jit b/gcc/jit/ChangeLog.jit
index d0c76fc..78c1b65 100644
--- a/gcc/jit/ChangeLog.jit
+++ b/gcc/jit/ChangeLog.jit
@@ -1,5 +1,53 @@
 2013-10-17  David Malcolm  <dmalc...@redhat.com>
 
+       * internal-api.c (gcc::jit::context::get_void_type): Remove.
+       (gcc::jit::context::get_char_type): Remove.
+       (gcc::jit::context::get_int_type): Remove.
+       (gcc::jit::context::get_float_type): Remove.
+       (gcc::jit::context::get_double_type): Remove.
+       (get_tree_node_for_type): New.
+       (gcc::jit::context::get_type): New.
+       (gcc::jit::context::new_rvalue_from_double): New.
+       (gcc::jit::context::new_rvalue_from_ptr): New.
+       * internal-api.h (gcc::jit::context::get_void_type): Remove.
+       (gcc::jit::context::get_char_type): Remove.
+       (gcc::jit::context::get_int_type): Remove.
+       (gcc::jit::context::get_float_type): Remove.
+       (gcc::jit::context::get_double_type): Remove.
+       (gcc::jit::context::get_type): New.
+       (gcc::jit::context::new_rvalue_from_double): New.
+       (gcc::jit::context::new_rvalue_from_ptr): New.
+       * libgccjit.c (gcc_jit_context_get_void_type): Remove.
+       (gcc_jit_context_get_char_type): Remove.
+       (gcc_jit_context_get_int_type): Remove.
+       (gcc_jit_context_get_float_type): Remove.
+       (gcc_jit_context_get_double_type): Remove.
+       (gcc_jit_context_get_type): New.
+       (gcc_jit_context_new_rvalue_from_double): New.
+       (gcc_jit_context_new_rvalue_from_ptr): New.
+       * libgccjit.h (gcc_jit_context_get_void_type): Remove.
+       (gcc_jit_context_get_char_type): Remove.
+       (gcc_jit_context_get_int_type): Remove.
+       (gcc_jit_context_get_float_type): Remove.
+       (gcc_jit_context_get_double_type): Remove.
+       (enum gcc_jit_types): New.
+       (gcc_jit_context_get_type): New.
+       (gcc_jit_context_new_rvalue_from_double): New.
+       (gcc_jit_context_new_rvalue_from_ptr): New.
+       * libgccjit.map (gcc_jit_context_get_void_type): Remove.
+       (gcc_jit_context_get_char_type): Remove.
+       (gcc_jit_context_get_int_type): Remove.
+       (gcc_jit_context_get_float_type): Remove.
+       (gcc_jit_context_get_double_type): Remove.
+       (enum gcc_jit_types): New.
+       (gcc_jit_context_get_type): New.
+       (gcc_jit_context_new_rvalue_from_double): New.
+       (gcc_jit_context_new_rvalue_from_ptr): New.
+       * TODO.rst ("access to more primitive types"): Remove
+       completed item.
+
+2013-10-17  David Malcolm  <dmalc...@redhat.com>
+
        * libgccjit.h: Add and reword comments throughout.
 
 2013-10-17  David Malcolm  <dmalc...@redhat.com>
diff --git a/gcc/jit/TODO.rst b/gcc/jit/TODO.rst
index f126fcc..ffe4c37 100644
--- a/gcc/jit/TODO.rst
+++ b/gcc/jit/TODO.rst
@@ -44,17 +44,6 @@ Initial Release
 
   e.g. (void*) to (struct foo*)
 
-* access to more primitive types::
-
-    enum gcc_jit_types {
-       GCC_JIT_TYPE_SIGNED_INT,
-       // etc
-    };
-
-    extern gcc_jit_type *
-    gcc_jit_context_get_type (gcc_jit_context *,
-                              enum gcc_jit_types type);
-
 * support more arithmetic ops and comparison modes
 
 * access to a function by address::
diff --git a/gcc/jit/internal-api.c b/gcc/jit/internal-api.c
index c48257f..9232215 100644
--- a/gcc/jit/internal-api.c
+++ b/gcc/jit/internal-api.c
@@ -67,39 +67,80 @@ set_code_factory (gcc_jit_code_callback cb,
   m_user_data = user_data;
 }
 
-gcc::jit::type *
-gcc::jit::context::
-get_void_type ()
-{
-  return new type (void_type_node);
-}
-
-gcc::jit::type *
-gcc::jit::context::
-get_char_type ()
+static tree
+get_tree_node_for_type (enum gcc_jit_types type_)
 {
-  return new type (char_type_node);
-}
+  switch (type_)
+    {
+    case GCC_JIT_TYPE_VOID:
+      return void_type_node;
+
+    case GCC_JIT_TYPE_VOID_PTR:
+      return ptr_type_node;
+
+    case GCC_JIT_TYPE_CHAR:
+      return char_type_node;
+    case GCC_JIT_TYPE_SIGNED_CHAR:
+      return signed_char_type_node;
+    case GCC_JIT_TYPE_UNSIGNED_CHAR:
+      return unsigned_char_type_node;
+
+    case GCC_JIT_TYPE_SHORT:
+      return short_integer_type_node;
+    case GCC_JIT_TYPE_UNSIGNED_SHORT:
+      return short_unsigned_type_node;
+
+    case GCC_JIT_TYPE_CONST_CHAR_PTR:
+      {
+       tree const_char = build_qualified_type (char_type_node,
+                                               TYPE_QUAL_CONST);
+       return build_pointer_type (const_char);
+      }
+
+    case GCC_JIT_TYPE_INT:
+      return integer_type_node;
+    case GCC_JIT_TYPE_UNSIGNED_INT:
+      return unsigned_type_node;
+
+    case GCC_JIT_TYPE_LONG:
+      return long_integer_type_node;
+    case GCC_JIT_TYPE_UNSIGNED_LONG:
+      return long_unsigned_type_node;
+
+    case GCC_JIT_TYPE_LONG_LONG:
+      return long_long_integer_type_node;
+    case GCC_JIT_TYPE_UNSIGNED_LONG_LONG:
+      return long_long_unsigned_type_node;
+
+    case GCC_JIT_TYPE_FLOAT:
+      return float_type_node;
+    case GCC_JIT_TYPE_DOUBLE:
+      return double_type_node;
+    case GCC_JIT_TYPE_LONG_DOUBLE:
+      return long_double_type_node;
+
+    case GCC_JIT_TYPE_SIZE_T:
+      return size_type_node;
+
+    case GCC_JIT_TYPE_FILE_PTR:
+      return fileptr_type_node;
+    }
 
-gcc::jit::type *
-gcc::jit::context::
-get_int_type ()
-{
-  return new type (intSI_type_node);
+  return NULL;
 }
 
 gcc::jit::type *
 gcc::jit::context::
-get_float_type ()
+get_type (enum gcc_jit_types type_)
 {
-  return new type (float_type_node);
-}
+  tree type_node = get_tree_node_for_type (type_);
+  if (NULL == type_node)
+    {
+      add_error ("unrecognized (enum gcc_jit_types) value");
+      return NULL;
+    }
 
-gcc::jit::type *
-gcc::jit::context::
-get_double_type ()
-{
-  return new type (double_type_node);
+  return new type (type_node);
 }
 
 gcc::jit::field *
@@ -283,6 +324,45 @@ new_rvalue_from_int (type *type,
 
 gcc::jit::rvalue *
 gcc::jit::context::
+new_rvalue_from_double (type *type,
+                       double value)
+{
+  // FIXME: type-checking, or coercion?
+  tree inner_type = type->as_tree ();
+
+  /* We have a "double", we want a REAL_VALUE_TYPE.
+
+     real.c:real_from_target appears to require the representation to be
+     split into 32-bit values, and then sent as an pair of host long
+     ints.  */
+  REAL_VALUE_TYPE real_value;
+  union
+  {
+    double as_double;
+    uint32_t as_uint32s[2];
+  } u;
+  u.as_double = value;
+  long int as_long_ints[2];
+  as_long_ints[0] = u.as_uint32s[0];
+  as_long_ints[1] = u.as_uint32s[1];
+  real_from_target (&real_value, as_long_ints, DFmode);
+  tree inner = build_real (inner_type, real_value);
+  return new rvalue (inner);
+}
+
+gcc::jit::rvalue *
+gcc::jit::context::
+new_rvalue_from_ptr (type *type,
+                    void *value)
+{
+  tree inner_type = type->as_tree ();
+  /* FIXME: how to ensure we have a wide enough type?  */
+  tree inner = build_int_cstu (inner_type, (unsigned HOST_WIDE_INT)value);
+  return new rvalue (inner);
+}
+
+gcc::jit::rvalue *
+gcc::jit::context::
 new_string_literal (const char *value)
 {
   tree t_str = build_string (strlen (value), value);
diff --git a/gcc/jit/internal-api.h b/gcc/jit/internal-api.h
index e3650fc..b145cb3 100644
--- a/gcc/jit/internal-api.h
+++ b/gcc/jit/internal-api.h
@@ -40,19 +40,7 @@ public:
                int column);
 
   type *
-  get_void_type ();
-
-  type *
-  get_char_type ();
-
-  type *
-  get_int_type ();
-
-  type *
-  get_float_type ();
-
-  type *
-  get_double_type ();
+  get_type (enum gcc_jit_types type);
 
   field *
   new_field (location *loc,
@@ -90,6 +78,14 @@ public:
                       int value);
 
   rvalue *
+  new_rvalue_from_double (type *type,
+                         double value);
+
+  rvalue *
+  new_rvalue_from_ptr (type *type,
+                      void *value);
+
+  rvalue *
   new_string_literal (const char *value);
 
   rvalue *
diff --git a/gcc/jit/libgccjit.c b/gcc/jit/libgccjit.c
index ec854a1..5da2889 100644
--- a/gcc/jit/libgccjit.c
+++ b/gcc/jit/libgccjit.c
@@ -97,38 +97,11 @@ gcc_jit_context_new_location (gcc_jit_context *ctxt,
 }
 
 gcc_jit_type *
-gcc_jit_context_get_void_type (gcc_jit_context *ctxt)
+gcc_jit_context_get_type (gcc_jit_context *ctxt,
+                         enum gcc_jit_types type)
 {
   ASSERT_WITHIN_CALLBACK (ctxt);
-  return (gcc_jit_type *)ctxt->get_void_type ();
-}
-
-gcc_jit_type *
-gcc_jit_context_get_char_type (gcc_jit_context *ctxt)
-{
-  ASSERT_WITHIN_CALLBACK (ctxt);
-  return (gcc_jit_type *)ctxt->get_char_type ();
-}
-
-gcc_jit_type *
-gcc_jit_context_get_int_type (gcc_jit_context *ctxt)
-{
-  ASSERT_WITHIN_CALLBACK (ctxt);
-  return (gcc_jit_type *)ctxt->get_int_type ();
-}
-
-gcc_jit_type *
-gcc_jit_context_get_float_type (gcc_jit_context *ctxt)
-{
-  ASSERT_WITHIN_CALLBACK (ctxt);
-  return (gcc_jit_type *)ctxt->get_float_type ();
-}
-
-gcc_jit_type *
-gcc_jit_context_get_double_type (gcc_jit_context *ctxt)
-{
-  ASSERT_WITHIN_CALLBACK (ctxt);
-  return (gcc_jit_type *)ctxt->get_double_type ();
+  return (gcc_jit_type *)ctxt->get_type (type);
 }
 
 gcc_jit_type *
@@ -254,6 +227,22 @@ gcc_jit_context_one (gcc_jit_context *ctxt,
 }
 
 gcc_jit_rvalue *
+gcc_jit_context_new_rvalue_from_double (gcc_jit_context *ctxt,
+                                       gcc_jit_type *type,
+                                       double value)
+{
+  return (gcc_jit_rvalue *)ctxt->new_rvalue_from_double (type, value);
+}
+
+gcc_jit_rvalue *
+gcc_jit_context_new_rvalue_from_ptr (gcc_jit_context *ctxt,
+                                    gcc_jit_type *type,
+                                    void *value)
+{
+  return (gcc_jit_rvalue *)ctxt->new_rvalue_from_ptr (type, value);
+}
+
+gcc_jit_rvalue *
 gcc_jit_context_new_string_literal (gcc_jit_context *ctxt,
                                    const char *value)
 {
diff --git a/gcc/jit/libgccjit.h b/gcc/jit/libgccjit.h
index e4b8de6..a3da478 100644
--- a/gcc/jit/libgccjit.h
+++ b/gcc/jit/libgccjit.h
@@ -267,20 +267,57 @@ gcc_jit_context_new_location (gcc_jit_context *ctxt,
  **********************************************************************/
 
 /* Access to specific types.  */
-extern gcc_jit_type *
-gcc_jit_context_get_void_type (gcc_jit_context *ctxt);
+enum gcc_jit_types
+{
+  /* C's "void" type.  */
+  GCC_JIT_TYPE_VOID,
 
-extern gcc_jit_type *
-gcc_jit_context_get_char_type (gcc_jit_context *ctxt);
+  /* "void *".  */
+  GCC_JIT_TYPE_VOID_PTR,
 
-extern gcc_jit_type *
-gcc_jit_context_get_int_type (gcc_jit_context *ctxt);
+  /* Various integer types.  */
 
-extern gcc_jit_type *
-gcc_jit_context_get_float_type (gcc_jit_context *ctxt);
+  /* C's "char" (of some signedness) and the variants where the
+     signedness is specified.  */
+  GCC_JIT_TYPE_CHAR,
+  GCC_JIT_TYPE_SIGNED_CHAR,
+  GCC_JIT_TYPE_UNSIGNED_CHAR,
+
+  /* C's "short" and "unsigned short".  */
+  GCC_JIT_TYPE_SHORT, /* signed */
+  GCC_JIT_TYPE_UNSIGNED_SHORT,
+
+  /* C's "int" and "unsigned int".  */
+  GCC_JIT_TYPE_INT, /* signed */
+  GCC_JIT_TYPE_UNSIGNED_INT,
+
+  /* C's "long" and "unsigned long".  */
+  GCC_JIT_TYPE_LONG, /* signed */
+  GCC_JIT_TYPE_UNSIGNED_LONG,
+
+  /* C99's "long long" and "unsigned long long".  */
+  GCC_JIT_TYPE_LONG_LONG, /* signed */
+  GCC_JIT_TYPE_UNSIGNED_LONG_LONG,
+
+  /* Floating-point types  */
+
+  GCC_JIT_TYPE_FLOAT,
+  GCC_JIT_TYPE_DOUBLE,
+  GCC_JIT_TYPE_LONG_DOUBLE,
+
+  /* C type: (const char *).  */
+  GCC_JIT_TYPE_CONST_CHAR_PTR,
+
+ /* The C "size_t" type.  */
+  GCC_JIT_TYPE_SIZE_T,
+
+ /* C type: (FILE *)  */
+  GCC_JIT_TYPE_FILE_PTR
+};
 
 extern gcc_jit_type *
-gcc_jit_context_get_double_type (gcc_jit_context *ctxt);
+gcc_jit_context_get_type (gcc_jit_context *ctxt,
+                         enum gcc_jit_types type_);
 
 /* Constructing new types. */
 
@@ -380,6 +417,18 @@ extern gcc_jit_rvalue *
 gcc_jit_context_one (gcc_jit_context *ctxt,
                     gcc_jit_type *type);
 
+/* Floating-point constants.  */
+extern gcc_jit_rvalue *
+gcc_jit_context_new_rvalue_from_double (gcc_jit_context *ctxt,
+                                       gcc_jit_type *type,
+                                       double value);
+
+/* Pointers.  */
+extern gcc_jit_rvalue *
+gcc_jit_context_new_rvalue_from_ptr (gcc_jit_context *ctxt,
+                                    gcc_jit_type *type,
+                                    void *value);
+
 /* String literals. */
 extern gcc_jit_rvalue *
 gcc_jit_context_new_string_literal (gcc_jit_context *ctxt,
diff --git a/gcc/jit/libgccjit.map b/gcc/jit/libgccjit.map
index a8b91e6..beaf0de 100644
--- a/gcc/jit/libgccjit.map
+++ b/gcc/jit/libgccjit.map
@@ -4,11 +4,7 @@
     # Keep this list sorted alphabetically:
     gcc_jit_context_acquire;
     gcc_jit_context_compile;
-    gcc_jit_context_get_char_type;
-    gcc_jit_context_get_double_type;
-    gcc_jit_context_get_float_type;
-    gcc_jit_context_get_int_type;
-    gcc_jit_context_get_void_type;
+    gcc_jit_context_get_type;
     gcc_jit_context_new_array_lookup;
     gcc_jit_context_new_binary_op;
     gcc_jit_context_new_call;
@@ -19,7 +15,9 @@
     gcc_jit_context_new_global;
     gcc_jit_context_new_location;
     gcc_jit_context_new_param;
+    gcc_jit_context_new_rvalue_from_double;
     gcc_jit_context_new_rvalue_from_int;
+    gcc_jit_context_new_rvalue_from_ptr;
     gcc_jit_context_new_string_literal;
     gcc_jit_context_new_struct_type;
     gcc_jit_context_one;
diff --git a/gcc/testsuite/ChangeLog.jit b/gcc/testsuite/ChangeLog.jit
index 7cc8fa1..87cb958 100644
--- a/gcc/testsuite/ChangeLog.jit
+++ b/gcc/testsuite/ChangeLog.jit
@@ -1,3 +1,21 @@
+2013-10-17  David Malcolm  <dmalc...@redhat.com>
+
+       * jit.dg/test-accessing-struct.c (code_making_callback): Update
+       for changes to type API.
+       * jit.dg/test-calling-external-function.c (code_making_callback):
+       Likewise.
+       * jit.dg/test-dot-product.c (code_making_callback): Likewise.
+       * jit.dg/test-factorial.c (code_making_callback): Likewise.
+       * jit.dg/test-fibonacci.c (code_making_callback): Likewise.
+       * jit.dg/test-hello-world.c (code_making_callback): Likewise.
+       * jit.dg/test-string-literal.c (code_making_callback): Likewise.
+       * jit.dg/test-sum-of-squares.c (code_making_callback): Likewise.
+       * jit.dg/test-using-globals.c (code_making_callback): Likewise.
+       * jit.dg/test-types.c: New.
+       * jit.dg/test-combination.c (code_making_callback): Use code
+       from test-types.c.
+       (verify_code): ...and verify it.
+
 2013-10-16  David Malcolm  <dmalc...@redhat.com>
 
        * jit.dg/test-dot-product.c (code_making_callback): Update for
diff --git a/gcc/testsuite/jit.dg/test-accessing-struct.c 
b/gcc/testsuite/jit.dg/test-accessing-struct.c
index 223b679..46f112a 100644
--- a/gcc/testsuite/jit.dg/test-accessing-struct.c
+++ b/gcc/testsuite/jit.dg/test-accessing-struct.c
@@ -22,8 +22,10 @@ code_making_callback (gcc_jit_context *ctxt, void *user_data)
         f->z = f->x * f->y;
      }
   */
-  gcc_jit_type *void_type = gcc_jit_context_get_void_type (ctxt);
-  gcc_jit_type *int_type = gcc_jit_context_get_int_type (ctxt);
+  gcc_jit_type *void_type =
+    gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_VOID);
+  gcc_jit_type *int_type =
+    gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT);
   gcc_jit_field *x =
     gcc_jit_context_new_field (ctxt,
                                NULL,
diff --git a/gcc/testsuite/jit.dg/test-calling-external-function.c 
b/gcc/testsuite/jit.dg/test-calling-external-function.c
index 0e2a0a9..6e5dd7d 100644
--- a/gcc/testsuite/jit.dg/test-calling-external-function.c
+++ b/gcc/testsuite/jit.dg/test-calling-external-function.c
@@ -29,8 +29,10 @@ code_making_callback (gcc_jit_context *ctxt, void *user_data)
      }
   */
   int i;
-  gcc_jit_type *void_type = gcc_jit_context_get_void_type (ctxt);
-  gcc_jit_type *int_type = gcc_jit_context_get_int_type (ctxt);
+  gcc_jit_type *void_type =
+    gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_VOID);
+  gcc_jit_type *int_type =
+    gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT);
 
   /* Declare the imported function.  */
   gcc_jit_param *params[3];
diff --git a/gcc/testsuite/jit.dg/test-combination.c 
b/gcc/testsuite/jit.dg/test-combination.c
index 6eb8dbe..2bf7124 100644
--- a/gcc/testsuite/jit.dg/test-combination.c
+++ b/gcc/testsuite/jit.dg/test-combination.c
@@ -66,6 +66,13 @@
 #undef code_making_callback
 #undef verify_code
 
+/* test-types.c */
+#define code_making_callback code_making_callback_types
+#define verify_code verify_code_types
+#include "test-types.c"
+#undef code_making_callback
+#undef verify_code
+
 /* test-using-global.c */
 #define code_making_callback code_making_callback_using_global
 #define verify_code verify_code_using_global
@@ -93,6 +100,7 @@ code_making_callback (gcc_jit_context *ctxt, void * 
user_data)
   errors += code_making_callback_hello_world (ctxt, user_data);
   errors += code_making_callback_string_literal (ctxt, user_data);
   errors += code_making_callback_sum_of_squares (ctxt, user_data);
+  errors += code_making_callback_types (ctxt, user_data);
   errors += code_making_callback_using_global (ctxt, user_data);
 
   return errors;
@@ -109,5 +117,6 @@ verify_code (gcc_jit_result *result)
   verify_code_hello_world (result);
   verify_code_string_literal (result);
   verify_code_sum_of_squares (result);
+  verify_code_types (result);
   verify_code_using_global (result);
 }
diff --git a/gcc/testsuite/jit.dg/test-dot-product.c 
b/gcc/testsuite/jit.dg/test-dot-product.c
index d01e495..3a8a59a 100644
--- a/gcc/testsuite/jit.dg/test-dot-product.c
+++ b/gcc/testsuite/jit.dg/test-dot-product.c
@@ -21,9 +21,11 @@ code_making_callback (gcc_jit_context *ctxt, void *user_data)
        }
 
      and see what the optimizer can do.  */
-  gcc_jit_type *val_type = gcc_jit_context_get_double_type (ctxt);
+  gcc_jit_type *val_type =
+    gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_DOUBLE);
   gcc_jit_type *ptr_type = gcc_jit_type_get_pointer (val_type);
-  gcc_jit_type *int_type = gcc_jit_context_get_int_type (ctxt);
+  gcc_jit_type *int_type =
+    gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT);
 
   gcc_jit_type *return_type = val_type;
   gcc_jit_param *param_n =
diff --git a/gcc/testsuite/jit.dg/test-factorial.c 
b/gcc/testsuite/jit.dg/test-factorial.c
index 90b4fbe..5c3b237 100644
--- a/gcc/testsuite/jit.dg/test-factorial.c
+++ b/gcc/testsuite/jit.dg/test-factorial.c
@@ -22,7 +22,8 @@ code_making_callback (gcc_jit_context *ctxt, void *user_data)
 
      and see if the optimizer eliminates the recursion (it does).
    */
-  gcc_jit_type *the_type = gcc_jit_context_get_int_type (ctxt);
+  gcc_jit_type *the_type =
+    gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT);
   gcc_jit_type *return_type = the_type;
 
   gcc_jit_param *x =
diff --git a/gcc/testsuite/jit.dg/test-fibonacci.c 
b/gcc/testsuite/jit.dg/test-fibonacci.c
index 215546c..16d8a46 100644
--- a/gcc/testsuite/jit.dg/test-fibonacci.c
+++ b/gcc/testsuite/jit.dg/test-fibonacci.c
@@ -30,7 +30,8 @@ FIRST_LINE + 7: }
      in the debugger, stepping through the above commented-out code
      fragement.
    */
-  gcc_jit_type *the_type = gcc_jit_context_get_int_type (ctxt);
+  gcc_jit_type *the_type =
+    gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT);
   gcc_jit_type *return_type = the_type;
 
   gcc_jit_param *x =
diff --git a/gcc/testsuite/jit.dg/test-hello-world.c 
b/gcc/testsuite/jit.dg/test-hello-world.c
index e7856c6..0e3af81 100644
--- a/gcc/testsuite/jit.dg/test-hello-world.c
+++ b/gcc/testsuite/jit.dg/test-hello-world.c
@@ -15,10 +15,10 @@ code_making_callback (gcc_jit_context *ctxt, void 
*user_data)
         printf ("hello %s\n", name);
      }
   */
-  gcc_jit_type *void_type = gcc_jit_context_get_void_type (ctxt);
+  gcc_jit_type *void_type =
+    gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_VOID);
   gcc_jit_type *const_char_ptr_type =
-    gcc_jit_type_get_pointer (
-      gcc_jit_type_get_const (gcc_jit_context_get_char_type (ctxt)));
+    gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_CONST_CHAR_PTR);
   gcc_jit_param *param_name =
     gcc_jit_context_new_param (ctxt, NULL, const_char_ptr_type, "name");
   gcc_jit_function *func =
@@ -33,11 +33,12 @@ code_making_callback (gcc_jit_context *ctxt, void 
*user_data)
     gcc_jit_context_new_param (ctxt, NULL, const_char_ptr_type, "format");
   gcc_jit_function *printf_func =
     gcc_jit_context_new_function (ctxt, NULL,
-                                  GCC_JIT_FUNCTION_IMPORTED,
-                                  gcc_jit_context_get_int_type (ctxt),
-                                  "printf",
-                                  1, &param_format,
-                                  1);
+                                 GCC_JIT_FUNCTION_IMPORTED,
+                                 gcc_jit_context_get_type (
+                                    ctxt, GCC_JIT_TYPE_INT),
+                                 "printf",
+                                 1, &param_format,
+                                 1);
   gcc_jit_rvalue *args[2];
   args[0] = gcc_jit_context_new_string_literal (ctxt, "hello %s\n");
   args[1] = gcc_jit_param_as_rvalue (param_name);
diff --git a/gcc/testsuite/jit.dg/test-string-literal.c 
b/gcc/testsuite/jit.dg/test-string-literal.c
index 0eb08d5..cd373ad 100644
--- a/gcc/testsuite/jit.dg/test-string-literal.c
+++ b/gcc/testsuite/jit.dg/test-string-literal.c
@@ -18,8 +18,7 @@ code_making_callback (gcc_jit_context *ctxt, void *user_data)
      }
   */
   gcc_jit_type *const_char_ptr_type =
-    gcc_jit_type_get_pointer (
-      gcc_jit_type_get_const (gcc_jit_context_get_char_type (ctxt)));
+    gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_CONST_CHAR_PTR);
 
   /* Build the test_fn.  */
   gcc_jit_function *test_fn =
diff --git a/gcc/testsuite/jit.dg/test-sum-of-squares.c 
b/gcc/testsuite/jit.dg/test-sum-of-squares.c
index c8bb16a..48ac93f 100644
--- a/gcc/testsuite/jit.dg/test-sum-of-squares.c
+++ b/gcc/testsuite/jit.dg/test-sum-of-squares.c
@@ -22,7 +22,8 @@ code_making_callback (gcc_jit_context *ctxt, void *user_data)
       }
       return sum;
    */
-  gcc_jit_type *the_type = gcc_jit_context_get_int_type (ctxt);
+  gcc_jit_type *the_type =
+    gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT);
   gcc_jit_type *return_type = the_type;
 
   gcc_jit_param *n =
diff --git a/gcc/testsuite/jit.dg/test-types.c 
b/gcc/testsuite/jit.dg/test-types.c
new file mode 100644
index 0000000..4c30547
--- /dev/null
+++ b/gcc/testsuite/jit.dg/test-types.c
@@ -0,0 +1,287 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <stddef.h>
+
+#include "libgccjit.h"
+
+#include "harness.h"
+
+struct zoo
+{
+  void *m_void_ptr;
+
+  char m_char;
+  signed char m_signed_char;
+  unsigned char m_unsigned_char;
+
+  short m_short;
+  unsigned short m_unsigned_short;
+
+  int m_int;
+  unsigned int m_unsigned_int;
+
+  long m_long;
+  unsigned long m_unsigned_long;
+
+  long long m_long_long;
+  unsigned long long m_unsigned_long_long;
+
+  float m_float;
+  double m_double;
+  long double m_long_double;
+
+  const char *m_const_char_ptr;
+
+  size_t m_size_t;
+
+  FILE *m_FILE_ptr;
+};
+
+/* Now describe the struct in libgccjit terms. */
+struct field
+{
+  enum gcc_jit_types type_;
+  const char *name;
+};
+
+const struct field fields[] = {
+  {GCC_JIT_TYPE_VOID_PTR, "m_void_ptr"},
+
+  {GCC_JIT_TYPE_CHAR, "m_char"},
+  {GCC_JIT_TYPE_SIGNED_CHAR, "m_signed_char"},
+  {GCC_JIT_TYPE_UNSIGNED_CHAR, "m_unsigned_char"},
+
+  {GCC_JIT_TYPE_SHORT, "m_short"},
+  {GCC_JIT_TYPE_UNSIGNED_SHORT, "m_unsigned_short"},
+
+  {GCC_JIT_TYPE_INT, "m_int"},
+  {GCC_JIT_TYPE_UNSIGNED_INT, "m_unsigned_int"},
+
+  {GCC_JIT_TYPE_LONG, "m_long"},
+  {GCC_JIT_TYPE_UNSIGNED_LONG, "m_unsigned_long"},
+
+  {GCC_JIT_TYPE_LONG_LONG, "m_long_long"},
+  {GCC_JIT_TYPE_UNSIGNED_LONG_LONG, "m_unsigned_long_long"},
+
+  {GCC_JIT_TYPE_FLOAT, "m_float"},
+  {GCC_JIT_TYPE_DOUBLE, "m_double"},
+  {GCC_JIT_TYPE_LONG_DOUBLE, "m_long_double"},
+
+  {GCC_JIT_TYPE_CONST_CHAR_PTR, "m_const_char_ptr"},
+
+  {GCC_JIT_TYPE_SIZE_T, "m_size_t"},
+
+  {GCC_JIT_TYPE_FILE_PTR, "m_FILE_ptr"},
+
+};
+
+#define NUM_FIELDS (sizeof(fields)/sizeof(fields[0]))
+
+int test_int = 42;
+int *test_ptr = &test_int;
+
+const char *test_string = "test_string";
+
+int
+code_making_callback (gcc_jit_context *ctxt, void *user_data)
+{
+  /* Let's try to inject the equivalent of:
+
+     void
+     test_caller (struct zoo *z)
+     {
+       for each fields "m_field":
+         z->m_field = ...some data;
+     }
+  */
+  int i;
+  gcc_jit_type *void_type =
+    gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_VOID);
+  gcc_jit_field *zoo_fields[NUM_FIELDS];
+  for (i = 0; i < NUM_FIELDS; i++)
+    zoo_fields[i] =
+      gcc_jit_context_new_field (
+       ctxt, NULL,
+       gcc_jit_context_get_type (ctxt, fields[i].type_),
+       fields[i].name);
+  gcc_jit_type *zoo_type =
+    gcc_jit_context_new_struct_type (ctxt,
+                                    NULL,
+                                    "zoo",
+                                    NUM_FIELDS,
+                                    zoo_fields);
+  gcc_jit_type *zoo_ptr_type =
+    gcc_jit_type_get_pointer (zoo_type);
+
+  /* Build the test_fn.         */
+  gcc_jit_param *param_z =
+    gcc_jit_context_new_param (ctxt, NULL, zoo_ptr_type, "z");
+  gcc_jit_function *test_fn =
+    gcc_jit_context_new_function (ctxt, NULL,
+                                 GCC_JIT_FUNCTION_EXPORTED,
+                                 void_type,
+                                 "test_types",
+                                 1, &param_z,
+                                 0);
+
+  /* Write to the various fields of param "z". */
+#define ASSIGN(FIELDNAME, EXPR) \
+  gcc_jit_function_add_assignment (            \
+    test_fn, NULL,                             \
+    gcc_jit_context_new_field_access (         \
+      ctxt, NULL,                              \
+      gcc_jit_param_as_rvalue (param_z),       \
+      (FIELDNAME)),                            \
+    (EXPR));
+
+  ASSIGN(
+    "m_void_ptr",
+    gcc_jit_context_new_rvalue_from_ptr (
+      ctxt,
+      gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_VOID_PTR),
+      test_ptr))
+
+  ASSIGN("m_char",
+    gcc_jit_context_new_rvalue_from_int (
+      ctxt,
+      gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_CHAR),
+      'V'))
+  ASSIGN("m_signed_char",
+    gcc_jit_context_new_rvalue_from_int (
+      ctxt,
+      gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_SIGNED_CHAR),
+      -37))
+  ASSIGN("m_unsigned_char",
+    gcc_jit_context_new_rvalue_from_int (
+      ctxt,
+      gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_UNSIGNED_CHAR),
+      200))
+
+  ASSIGN("m_short",
+    gcc_jit_context_new_rvalue_from_int (
+      ctxt,
+      gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_SHORT),
+      -900))
+  ASSIGN("m_unsigned_short",
+    gcc_jit_context_new_rvalue_from_int (
+      ctxt,
+      gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_UNSIGNED_SHORT),
+      0x3000))
+
+  ASSIGN("m_int",
+    gcc_jit_context_new_rvalue_from_int (
+      ctxt,
+      gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT),
+      -0x2000))
+  ASSIGN("m_unsigned_int",
+    gcc_jit_context_new_rvalue_from_int (
+      ctxt,
+      gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_UNSIGNED_INT),
+      1234567))
+
+  ASSIGN("m_long",
+    gcc_jit_context_new_rvalue_from_int (
+      ctxt,
+      gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_LONG),
+      -5))
+  ASSIGN("m_unsigned_long",
+    gcc_jit_context_new_rvalue_from_int (
+      ctxt,
+      gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_UNSIGNED_LONG),
+      12345678))
+
+  ASSIGN("m_long_long",
+    gcc_jit_context_new_rvalue_from_int (
+      ctxt,
+      gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_LONG_LONG),
+      -42))
+  ASSIGN("m_unsigned_long_long",
+    gcc_jit_context_new_rvalue_from_int (
+      ctxt,
+      gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_UNSIGNED_LONG_LONG),
+      123456789))
+
+  ASSIGN("m_float",
+    gcc_jit_context_new_rvalue_from_double (
+      ctxt,
+      gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_FLOAT),
+      3.141))
+  ASSIGN("m_double",
+    gcc_jit_context_new_rvalue_from_double (
+      ctxt,
+      gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_DOUBLE),
+      3.141))
+  ASSIGN("m_long_double",
+    gcc_jit_context_new_rvalue_from_double (
+      ctxt,
+      gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_LONG_DOUBLE),
+      3.141))
+
+  ASSIGN("m_const_char_ptr",
+    gcc_jit_context_new_rvalue_from_ptr (
+      ctxt,
+      gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_CONST_CHAR_PTR),
+      (char *)test_string))
+
+  ASSIGN("m_size_t",
+    gcc_jit_context_new_rvalue_from_int (
+      ctxt,
+      gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_SIZE_T),
+      sizeof (struct zoo)))
+
+  ASSIGN("m_FILE_ptr",
+    gcc_jit_context_new_rvalue_from_ptr (
+      ctxt,
+      gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_FILE_PTR),
+      stderr))
+
+#undef ASSIGN
+
+  return 0;
+}
+
+void
+verify_code (gcc_jit_result *result)
+{
+  typedef void (*fn_type) (struct zoo *);
+  CHECK_NON_NULL (result);
+
+  fn_type test_types =
+    (fn_type)gcc_jit_result_get_code (result, "test_types");
+  CHECK_NON_NULL (test_types);
+
+  struct zoo z;
+  memset (&z, 0xf0, sizeof (z));
+
+  /* Call the JIT-generated function.  */
+  test_types (&z);
+
+  /* Verify that it correctly wrote to the various fields.  */
+  CHECK_VALUE (z.m_void_ptr, test_ptr);
+
+  CHECK_VALUE (z.m_char, 'V');
+  CHECK_VALUE (z.m_signed_char, -37);
+  CHECK_VALUE (z.m_unsigned_char, 200);
+
+  CHECK_VALUE (z.m_short, -900);
+  CHECK_VALUE (z.m_unsigned_short, 0x3000);
+
+  CHECK_VALUE (z.m_int, -0x2000);
+  CHECK_VALUE (z.m_unsigned_int, 1234567);
+
+  CHECK_VALUE (z.m_long, -5);
+  CHECK_VALUE (z.m_unsigned_long, 12345678);
+
+  CHECK_VALUE (z.m_long_long, -42);
+  CHECK_VALUE (z.m_unsigned_long_long, 123456789);
+
+  CHECK_VALUE (z.m_float, 3.141f);
+  CHECK_VALUE (z.m_double, 3.141);
+  CHECK_VALUE (z.m_long_double, 3.141);
+
+  CHECK_VALUE (z.m_const_char_ptr, test_string);
+
+  CHECK_VALUE (z.m_size_t, sizeof (struct zoo));
+
+  CHECK_VALUE (z.m_FILE_ptr, stderr);
+}
diff --git a/gcc/testsuite/jit.dg/test-using-global.c 
b/gcc/testsuite/jit.dg/test-using-global.c
index 9e3caaf..8eabc31 100644
--- a/gcc/testsuite/jit.dg/test-using-global.c
+++ b/gcc/testsuite/jit.dg/test-using-global.c
@@ -27,8 +27,10 @@ code_making_callback (gcc_jit_context *ctxt, void *user_data)
        the_global += 1;
      }
   */
-  gcc_jit_type *void_type = gcc_jit_context_get_void_type (ctxt);
-  gcc_jit_type *int_type = gcc_jit_context_get_int_type (ctxt);
+  gcc_jit_type *void_type =
+    gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_VOID);
+  gcc_jit_type *int_type =
+    gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT);
 
   /* Build the test_fn.  */
   gcc_jit_function *test_fn =
-- 
1.7.11.7

Reply via email to