aboutsummaryrefslogtreecommitdiff
path: root/sim/common/gentmap.c
blob: 9f30e66e378bb39caa11cfde9d3698ed0093c67a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/* Generate targ-vals.h and targ-map.c.  */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct tdefs {
  char *symbol;
  int value;
};

static struct tdefs sys_tdefs[] = {
#define sys_defs
#include "nltvals.def"
#undef sys_defs
  { 0, 0 }
};

static struct tdefs errno_tdefs[] =  {
#define errno_defs
#include "nltvals.def"
#undef errno_defs
  { 0, 0 }
};

static struct tdefs signal_tdefs[] = {
#define signal_defs
#include "nltvals.def"
#undef signal_defs
  { 0, 0 }
};

static struct tdefs open_tdefs[] = {
#define open_defs
#include "nltvals.def"
#undef open_defs
  { 0, 0 }
};

static void
gen_targ_vals_h (void)
{
  struct tdefs *t;

  printf ("/* Target header values needed by the simulator and gdb.  */\n");
  printf ("/* This file is machine generated by gentmap.c.  */\n\n");

  printf ("#ifndef TARG_VALS_H\n");
  printf ("#define TARG_VALS_H\n\n");

  printf ("/* syscall values */\n");
  for (t = &sys_tdefs[0]; t->symbol; ++t)
    printf ("#define TARGET_%s %d\n", t->symbol, t->value);
  printf ("\n");

  printf ("/* signal values */\n");
  for (t = &signal_tdefs[0]; t->symbol; ++t)
    printf ("#define TARGET_%s %d\n", t->symbol, t->value);
  printf ("\n");

  printf ("/* open flag values */\n");
  for (t = &open_tdefs[0]; t->symbol; ++t)
    printf ("#define TARGET_%s 0x%x\n", t->symbol, t->value);
  printf ("\n");

  printf ("#endif /* TARG_VALS_H */\n");
}

static void
gen_targ_map_c (void)
{
  struct tdefs *t;

  printf ("/* Target value mapping utilities needed by the simulator and gdb.  */\n");
  printf ("/* This file is machine generated by gentmap.c.  */\n\n");

  printf ("#include \"defs.h\"\n");
  printf ("#include <errno.h>\n");
  printf ("#include <fcntl.h>\n");
  printf ("#include <signal.h>\n");
  printf ("#include \"ansidecl.h\"\n");
  printf ("#include \"sim/callback.h\"\n");
  printf ("#include \"targ-vals.h\"\n");
  printf ("\n");

  printf ("/* syscall mapping table */\n");
  printf ("CB_TARGET_DEFS_MAP cb_init_syscall_map[] = {\n");
  for (t = &sys_tdefs[0]; t->symbol; ++t)
    {
      printf ("#ifdef CB_%s\n", t->symbol);
      /* Skip the "SYS_" prefix for the name.  */
      printf ("  { \"%s\", CB_%s, TARGET_%s },\n", t->symbol + 4, t->symbol, t->symbol);
      printf ("#endif\n");
    }
  printf ("  { 0, -1, -1 }\n");
  printf ("};\n\n");

  printf ("/* errno mapping table */\n");
  printf ("CB_TARGET_DEFS_MAP cb_init_errno_map[] = {\n");
  for (t = &errno_tdefs[0]; t->symbol; ++t)
    {
      printf ("#define TARGET_%s %d\n", t->symbol, t->value);
      printf ("#ifdef %s\n", t->symbol);
      printf ("  { \"%s\", %s, TARGET_%s },\n", t->symbol, t->symbol, t->symbol);
      printf ("#endif\n");
    }
  printf ("  { 0, 0, 0 }\n");
  printf ("};\n\n");

  printf ("/* signals mapping table */\n");
  printf ("CB_TARGET_DEFS_MAP cb_init_signal_map[] = {\n");
  for (t = &signal_tdefs[0]; t->symbol; ++t)
    {
      printf ("#ifdef %s\n", t->symbol);
      printf ("  { \"%s\", %s, TARGET_%s },\n", t->symbol, t->symbol, t->symbol);
      printf ("#endif\n");
    }
  printf ("  { 0, -1, -1 }\n");
  printf ("};\n\n");

  printf ("/* open flags mapping table */\n");
  printf ("CB_TARGET_DEFS_MAP cb_init_open_map[] = {\n");
  for (t = &open_tdefs[0]; t->symbol; ++t)
    {
      printf ("#ifdef %s\n", t->symbol);
      printf ("  { \"%s\", %s, TARGET_%s },\n", t->symbol, t->symbol, t->symbol);
      printf ("#endif\n");
    }
  printf ("  { 0, -1, -1 }\n");
  printf ("};\n\n");
}

int
main (int argc, char *argv[])
{
  if (argc != 2)
    abort ();

  if (strcmp (argv[1], "-h") == 0)
    gen_targ_vals_h ();
  else if (strcmp (argv[1], "-c") == 0)
    gen_targ_map_c ();
  else
    abort ();

  exit (0);
}