aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/lib.c
diff options
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2019-12-15 09:44:13 +0100
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2019-12-16 10:27:22 +0100
commitd407146a779162d817c2d163c93c322d3bd07985 (patch)
tree47712a2f7fd9230386fd724c3af34649eb4ef2ae /lib.c
parent3e22c198adfb10614cd7455b97596f5222e2035d (diff)
downloadsparse-dev-d407146a779162d817c2d163c93c322d3bd07985.tar.gz
arch: move arch-specificities to their own files
lib.c and even more so, target.c, become cluttered by the arch specific type initialization. It would be better to move this to arch-specific files, move the generics target related helpers to target.c and have sparse_initialize() to just call these helpers. For doing this: * introduce a struct to hold the configurations for each arch, * move the arch-specific type initialization to separate files, * make target.c generic. Also change the default types to LP64. Note: this is the first step to better handle other arch specificities like the predefines or the handling of some options. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c58
1 files changed, 27 insertions, 31 deletions
diff --git a/lib.c b/lib.c
index 711e8fbe..d759648a 100644
--- a/lib.c
+++ b/lib.c
@@ -314,7 +314,7 @@ unsigned long fpasses = ~0UL;
int fpic = 0;
int fpie = 0;
int fshort_wchar = 0;
-int funsigned_char = -1;
+int funsigned_char = 0;
int preprocess_only;
@@ -728,6 +728,8 @@ static void handle_arch_finalize(void)
if (fpie > fpic)
fpic = fpie;
+ if (fshort_wchar)
+ wchar_ctype = &ushort_ctype;
switch (arch_mach) {
case MACH_ARM64:
@@ -1137,24 +1139,23 @@ static char **handle_arch(char *arg, char **next)
{
static const struct arch {
const char *name;
- char mach;
+ enum machine mach;
char bits;
- bool big_endian:1;
} archs[] = {
- { "aarch64", MACH_ARM64, 64, 0 },
- { "arm64", MACH_ARM64, 64, 0 },
- { "arm", MACH_ARM, 32, 0 },
- { "i386", MACH_I386, 32, 0 },
- { "m68k", MACH_M68K, 32, 0 },
- { "mips", MACH_MIPS32, 0, 1 },
- { "powerpc", MACH_PPC32, 0, 1 },
- { "ppc", MACH_PPC32, 0, 1 },
- { "riscv", MACH_RISCV32, 0, 0 },
- { "s390x", MACH_S390X, 64, 1 },
- { "s390", MACH_S390, 32, 1 },
- { "sparc", MACH_SPARC32, 0, 1 },
- { "x86_64", MACH_X86_64, 64, 0 },
- { "x86-64", MACH_X86_64, 64, 0 },
+ { "aarch64", MACH_ARM64, 64, },
+ { "arm64", MACH_ARM64, 64, },
+ { "arm", MACH_ARM, 32, },
+ { "i386", MACH_I386, 32, },
+ { "m68k", MACH_M68K, 32, },
+ { "mips", MACH_MIPS32, 0, },
+ { "powerpc", MACH_PPC32, 0, },
+ { "ppc", MACH_PPC32, 0, },
+ { "riscv", MACH_RISCV32, 0, },
+ { "s390x", MACH_S390X, 64, },
+ { "s390", MACH_S390, 32, },
+ { "sparc", MACH_SPARC32, 0, },
+ { "x86_64", MACH_X86_64, 64, },
+ { "x86-64", MACH_X86_64, 64, },
{ NULL },
};
const struct arch *p;
@@ -1165,18 +1166,15 @@ static char **handle_arch(char *arg, char **next)
for (p = &archs[0]; p->name; p++) {
size_t len = strlen(p->name);
if (strncmp(p->name, arg, len) == 0) {
+ enum machine mach = p->mach;
const char *suf = arg + len;
int bits = p->bits;
- arch_mach = p->mach;
if (bits == 0) {
- if (!strcmp(suf, "")) {
- bits = 32;
- } else if (!strcmp(suf, "32")) {
- bits = 32;
+ if (!strcmp(suf, "") || !strcmp(suf, "32")) {
+ ;
} else if (!strcmp(suf, "64")) {
- bits = 64;
- arch_mach += 1;
+ mach += 1;
} else {
die("invalid architecture: %s", arg);
}
@@ -1185,12 +1183,7 @@ static char **handle_arch(char *arg, char **next)
die("invalid architecture: %s", arg);
}
- // adjust the arch size (but keep x32 & llp64)
- if (bits == 32)
- arch_m64 = ARCH_LP32;
- else if (bits == 64 && arch_m64 == ARCH_LP32)
- arch_m64 = ARCH_LP64;
- arch_big_endian = p->big_endian;
+ target_config(mach);
break;
}
}
@@ -1748,6 +1741,9 @@ struct symbol_list *sparse_initialize(int argc, char **argv, struct string_list
// Initialize symbol stream first, so that we can add defines etc
init_symbols();
+ // initialize the default target to the native 'machine'
+ target_config(MACH_NATIVE);
+
args = argv;
for (;;) {
char *arg = *++args;
@@ -1777,7 +1773,7 @@ struct symbol_list *sparse_initialize(int argc, char **argv, struct string_list
list = NULL;
if (filelist) {
// Initialize type system
- init_target();
+ target_init();
handle_arch_finalize();
init_ctype();