summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlavio Cruz <flaviocruz@gmail.com>2016-04-19 03:05:13 -0400
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2020-01-28 00:38:25 +0100
commitecf59842e472d28a54a16acffe4aaa2f882108c6 (patch)
tree6b5b18641ec85d2b41ac4e6cb7f11ec044bf3c64
parent89298f4a0f61799b0a12e0ca297fe26a97c7e64e (diff)
Make MIG recognize the basic C integral types.
Also removed itMakeIntType which was not used anymore. Users can use char, int, and short types without having to define them. These types are defined using the builtin MACH_MSG_TYPE_* types and are architecture independent since they have the same size as the C char, short and int. If these basic types are redefined, MIG will still produce stub code but will produce a warning. * cpu.sym: Define sizeof_int, char, short. * tests/base_types.defs: Remove int. * tests/good/complex-types.defs: Use byte instead of char. * tests/good/directions: Remove char and int. * tests/good/types.defs: Remove char and also use short as a parameter in 'alltypes'. * type.c: Define itCIntTypeDecl. Remove itMakeIntType. Call itInsert for char, short and int. Message-Id: <20160419070513.GA12642@debian>
-rw-r--r--cpu.sym3
-rw-r--r--tests/base_types.defs1
-rw-r--r--tests/good/complex-types.defs4
-rw-r--r--tests/good/directions.defs3
-rw-r--r--tests/good/types.defs3
-rw-r--r--type.c56
6 files changed, 45 insertions, 25 deletions
diff --git a/cpu.sym b/cpu.sym
index eca50f3..36e5317 100644
--- a/cpu.sym
+++ b/cpu.sym
@@ -25,6 +25,9 @@
expr sizeof(integer_t) word_size
expr sizeof(integer_t)*8 word_size_in_bits
+expr sizeof(int) sizeof_int
+expr sizeof(char) sizeof_char
+expr sizeof(short) sizeof_short
expr sizeof(void*) sizeof_pointer
expr sizeof(mach_msg_header_t) sizeof_mach_msg_header_t
expr sizeof(mach_msg_type_t) sizeof_mach_msg_type_t
diff --git a/tests/base_types.defs b/tests/base_types.defs
index a226056..5118ea2 100644
--- a/tests/base_types.defs
+++ b/tests/base_types.defs
@@ -1,4 +1,3 @@
-type int = MACH_MSG_TYPE_INTEGER_32;
type int64_t = MACH_MSG_TYPE_INTEGER_64;
type int32_t = MACH_MSG_TYPE_INTEGER_32;
type mach_port_t = MACH_MSG_TYPE_COPY_SEND;
diff --git a/tests/good/complex-types.defs b/tests/good/complex-types.defs
index a10fc21..0a5c952 100644
--- a/tests/good/complex-types.defs
+++ b/tests/good/complex-types.defs
@@ -22,8 +22,8 @@ subsystem types 0;
import <stdint.h>;
import "types.h";
-type char = MACH_MSG_TYPE_BYTE;
-type intptr_t = ^char;
+type byte = MACH_MSG_TYPE_BYTE;
+type intptr_t = ^byte;
type pointer_t = ^array[] of MACH_MSG_TYPE_BYTE
ctype: vm_offset_t;
diff --git a/tests/good/directions.defs b/tests/good/directions.defs
index 37c5767..daae678 100644
--- a/tests/good/directions.defs
+++ b/tests/good/directions.defs
@@ -19,9 +19,6 @@
/* Tests arguments with different directions. */
subsystem directions 100;
-type char = MACH_MSG_TYPE_BYTE;
-type int = MACH_MSG_TYPE_INTEGER_32;
-
type mach_port_t = MACH_MSG_TYPE_COPY_SEND;
type mach_port_array_t = array[] of mach_port_t;
diff --git a/tests/good/types.defs b/tests/good/types.defs
index a27c191..5ef041c 100644
--- a/tests/good/types.defs
+++ b/tests/good/types.defs
@@ -23,7 +23,6 @@ import <stdint.h>;
import "types.h";
#include "../base_types.defs"
-type char = MACH_MSG_TYPE_CHAR;
type int16_t = MACH_MSG_TYPE_INTEGER_16;
type boolean_t = MACH_MSG_TYPE_BOOLEAN;
type uint16_t = MACH_MSG_TYPE_INTEGER_16;
@@ -50,7 +49,7 @@ type trans_int = int
outtran: int int8_to_int(int8_t);
routine alltypes(port : mach_port_t;
- c : char; s : int16_t; i : int;
+ c : char; s1 : int16_t; s2 : short; i : int;
i32 : int32_t; i64 : int64_t; bool : boolean_t;
ui16 : uint16_t; ui32 : uint32_t; ui64 : uint64_t);
diff --git a/type.c b/type.c
index 6e2319e..0facd9e 100644
--- a/type.c
+++ b/type.c
@@ -713,6 +713,40 @@ itCStringDecl(u_int count, boolean_t varying)
return it;
}
+/* Creates a new MIG type based on a basic integral C type. */
+static ipc_type_t *
+itCIntTypeDecl(const_string_t ctype, const size_t size)
+{
+ ipc_type_t *it;
+ switch (size) {
+ case 1:
+ it = itShortDecl(MACH_MSG_TYPE_CHAR, "MACH_MSG_TYPE_CHAR",
+ MACH_MSG_TYPE_CHAR, "MACH_MSG_TYPE_CHAR", size * 8);
+ break;
+ case 2:
+ it = itShortDecl(MACH_MSG_TYPE_INTEGER_16,
+ "MACH_MSG_TYPE_INTEGER_16", MACH_MSG_TYPE_INTEGER_16,
+ "MACH_MSG_TYPE_INTEGER_16", size * 8);
+ break;
+ case 4:
+ it = itShortDecl(MACH_MSG_TYPE_INTEGER_32,
+ "MACH_MSG_TYPE_INTEGER_32", MACH_MSG_TYPE_INTEGER_32,
+ "MACH_MSG_TYPE_INTEGER_32", size * 8);
+ break;
+ case 8:
+ it = itShortDecl(MACH_MSG_TYPE_INTEGER_64,
+ "MACH_MSG_TYPE_INTEGER_64", MACH_MSG_TYPE_INTEGER_64,
+ "MACH_MSG_TYPE_INTEGER_64", size * 8);
+ break;
+ default:
+ fprintf(stderr, "Unrecognized size %zu for type %s\n", size, ctype);
+ exit(EXIT_FAILURE);
+ }
+ it->itName = ctype;
+ itCalculateNameInfo(it);
+ return it;
+}
+
ipc_type_t *
itMakeCountType(void)
{
@@ -747,23 +781,6 @@ itMakeNaturalType(const char *name)
return it;
}
-extern ipc_type_t *
-itMakeIntType()
-{
- ipc_type_t *it = itAlloc();
-
- it->itName = "int";
- it->itInName = MACH_MSG_TYPE_INTEGER_32;
- it->itInNameStr = "MACH_MSG_TYPE_INTEGER_32";
- it->itOutName = MACH_MSG_TYPE_INTEGER_32;
- it->itOutNameStr = "MACH_MSG_TYPE_INTEGER_32";
- it->itSize = 32;
-
- itCalculateSizeInfo(it);
- itCalculateNameInfo(it);
- return it;
-}
-
ipc_type_t *
itMakePolyType(void)
{
@@ -856,6 +873,11 @@ init_type(void)
itWaitTimeType = itMakeNaturalType("mach_msg_timeout_t");
itMsgOptionType = itMakeNaturalType("mach_msg_option_t");
+
+ /* Define basic C integral types. */
+ itInsert("char", itCIntTypeDecl("char", sizeof_char));
+ itInsert("short", itCIntTypeDecl("short", sizeof_short));
+ itInsert("int", itCIntTypeDecl("int", sizeof_int));
}
/******************************************************