sim: nltvals: localize TARGET_<open> defines

Code should not be using these directly, instead they should be
resolving these dynamically via the open_map.  Rework the common
callback code that was using the defines to use symbolic names
instead, and localize some of the defines in the ARM code (since
it's a bit unclear how many different APIs it supports currently),
then remove the defines out of the header so no new code can rely on
them.
This commit is contained in:
Mike Frysinger 2021-07-06 23:21:20 -04:00
parent 88c8370b25
commit b868a2393b
3 changed files with 40 additions and 25 deletions

View File

@ -31,11 +31,6 @@
#include <errno.h>
#include <limits.h>
#include <string.h>
#include "targ-vals.h"
#ifndef TARGET_O_BINARY
#define TARGET_O_BINARY 0
#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h> /* For SEEK_SET etc. */
@ -188,7 +183,17 @@ ARMul_OSInit (ARMul_State * state)
return TRUE;
}
static int translate_open_mode[] =
/* These are libgloss defines, but seem to be common across all supported ARM
targets at the moment. These should get moved to the callback open_map. */
#define TARGET_O_BINARY 0
#define TARGET_O_APPEND 0x8
#define TARGET_O_CREAT 0x200
#define TARGET_O_RDONLY 0x0
#define TARGET_O_RDWR 0x2
#define TARGET_O_TRUNC 0x400
#define TARGET_O_WRONLY 0x1
static const int translate_open_mode[] =
{
TARGET_O_RDONLY, /* "r" */
TARGET_O_RDONLY + TARGET_O_BINARY, /* "rb" */

View File

@ -37,7 +37,6 @@
#include <sys/types.h>
#include <sys/stat.h>
#include "sim/callback.h"
#include "targ-vals.h"
/* For xmalloc. */
#include "libiberty.h"
@ -886,29 +885,44 @@ cb_target_to_host_open (host_callback *cb, int target_val)
{
int host_val = 0;
CB_TARGET_DEFS_MAP *m;
int o_rdonly = 0;
int o_wronly = 0;
int o_rdwr = 0;
int o_binary = 0;
int o_rdwrmask;
/* O_RDONLY can be (and usually is) 0 which needs to be treated specially. */
for (m = &cb->open_map[0]; m->host_val != -1; ++m)
{
if (!strcmp (m->name, "O_RDONLY"))
o_rdonly = m->target_val;
else if (!strcmp (m->name, "O_WRONLY"))
o_wronly = m->target_val;
else if (!strcmp (m->name, "O_RDWR"))
o_rdwr = m->target_val;
else if (!strcmp (m->name, "O_BINARY"))
o_binary = m->target_val;
}
o_rdwrmask = o_rdonly | o_wronly | o_rdwr;
for (m = &cb->open_map[0]; m->host_val != -1; ++m)
{
switch (m->target_val)
if (m->target_val == o_rdonly || m->target_val == o_wronly
|| m->target_val == o_rdwr)
{
/* O_RDONLY can be (and usually is) 0 which needs to be treated
specially. */
case TARGET_O_RDONLY :
case TARGET_O_WRONLY :
case TARGET_O_RDWR :
if ((target_val & (TARGET_O_RDONLY | TARGET_O_WRONLY | TARGET_O_RDWR))
== m->target_val)
if ((target_val & o_rdwrmask) == m->target_val)
host_val |= m->host_val;
/* Handle the host/target differentiating between binary and
text mode. Only one case is of importance */
#if ! defined (TARGET_O_BINARY) && defined (O_BINARY)
host_val |= O_BINARY;
#ifdef O_BINARY
if (o_binary == 0)
host_val |= O_BINARY;
#endif
break;
default :
}
else
{
if ((m->target_val & target_val) == m->target_val)
host_val |= m->host_val;
break;
}
}

View File

@ -39,11 +39,6 @@ gen_targ_vals_h (void)
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");
}
@ -78,6 +73,7 @@ gen_targ_map_c (void)
printf ("CB_TARGET_DEFS_MAP cb_init_open_map[] = {\n");
for (t = &open_tdefs[0]; t->symbol; ++t)
{
printf ("#define TARGET_%s 0x%x\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");