aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2019-12-01 22:55:12 +0100
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2019-12-16 10:27:51 +0100
commit376c74980d759ea4f9e8c6c10ecf83ea6565394d (patch)
tree1998e5e5fbef9b54ba91d11e37b4b9b6b3e2c2bd
parent47ed6c8134ea0b3459877f364969944426f7cdb5 (diff)
downloadsparse-376c74980d759ea4f9e8c6c10ecf83ea6565394d.tar.gz
arch: move handle_arch_finalize() into target_init()
Before initaializing the builtin types some 'finalizations' are needed. target_ini() already does most of this. So, move the arch-specific content of handle_arch_finalize() into the corresponding target files and the generic part to target_init(). Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r--lib.c35
-rw-r--r--lib.h1
-rw-r--r--target-arm64.c8
-rw-r--r--target-riscv.c12
-rw-r--r--target.c10
5 files changed, 32 insertions, 34 deletions
diff --git a/lib.c b/lib.c
index 82354af7..366acd45 100644
--- a/lib.c
+++ b/lib.c
@@ -320,7 +320,7 @@ int preprocess_only;
enum standard standard = STANDARD_GNU89;
-static int arch_msize_long = 0;
+int arch_msize_long = 0;
int arch_m64 = ARCH_M64_DEFAULT;
int arch_big_endian = ARCH_BIG_ENDIAN;
int arch_fp_abi = FP_ABI_NATIVE;
@@ -714,38 +714,6 @@ static char **handle_switch_m(char *arg, char **next)
return next;
}
-static void handle_arch_msize_long_finalize(void)
-{
- if (arch_msize_long) {
- size_t_ctype = &ulong_ctype;
- ssize_t_ctype = &long_ctype;
- }
-}
-
-static void handle_arch_finalize(void)
-{
- handle_arch_msize_long_finalize();
-
- if (fpie > fpic)
- fpic = fpie;
- if (fshort_wchar)
- wchar_ctype = &ushort_ctype;
-
- switch (arch_mach) {
- case MACH_ARM64:
- if (arch_cmodel == CMODEL_UNKNOWN)
- arch_cmodel = CMODEL_SMALL;
- break;
- case MACH_RISCV32:
- case MACH_RISCV64:
- if (arch_cmodel == CMODEL_UNKNOWN)
- arch_cmodel = CMODEL_MEDLOW;
- if (fpic)
- arch_cmodel = CMODEL_PIC;
- break;
- }
-}
-
static char **handle_switch_o(char *arg, char **next)
{
if (!strcmp (arg, "o")) { // "-o foo"
@@ -1732,7 +1700,6 @@ struct symbol_list *sparse_initialize(int argc, char **argv, struct string_list
if (filelist) {
// Initialize type system
target_init();
- handle_arch_finalize();
init_ctype();
predefined_macros();
diff --git a/lib.h b/lib.h
index 3e565c6f..d0585e36 100644
--- a/lib.h
+++ b/lib.h
@@ -205,6 +205,7 @@ extern int fpie;
extern int fshort_wchar;
extern int funsigned_char;
+extern int arch_msize_long;
extern int arch_m64;
extern int arch_big_endian;
extern int arch_fp_abi;
diff --git a/target-arm64.c b/target-arm64.c
index bfada515..1efd0899 100644
--- a/target-arm64.c
+++ b/target-arm64.c
@@ -3,6 +3,12 @@
#include "machine.h"
+static void init_arm64(const struct target *self)
+{
+ if (arch_cmodel == CMODEL_UNKNOWN)
+ arch_cmodel = CMODEL_SMALL;
+}
+
const struct target target_arm64 = {
.mach = MACH_ARM64,
.bitness = ARCH_LP64,
@@ -11,4 +17,6 @@ const struct target target_arm64 = {
.unsigned_char = 1,
.wchar = &uint_ctype,
+
+ .init = init_arm64,
};
diff --git a/target-riscv.c b/target-riscv.c
index cbec7623..09edfd7a 100644
--- a/target-riscv.c
+++ b/target-riscv.c
@@ -3,6 +3,14 @@
#include "machine.h"
+static void init_riscv(const struct target *self)
+{
+ if (arch_cmodel == CMODEL_UNKNOWN)
+ arch_cmodel = CMODEL_MEDLOW;
+ if (fpic)
+ arch_cmodel = CMODEL_PIC;
+}
+
const struct target target_riscv32 = {
.mach = MACH_RISCV32,
.bitness = ARCH_LP32,
@@ -10,6 +18,8 @@ const struct target target_riscv32 = {
.unsigned_char = 1,
.target_64bit = &target_riscv64,
+
+ .init = init_riscv,
};
const struct target target_riscv64 = {
@@ -19,4 +29,6 @@ const struct target target_riscv64 = {
.unsigned_char = 1,
.target_32bit = &target_riscv32,
+
+ .init = init_riscv,
};
diff --git a/target.c b/target.c
index 8d2d1058..006292cc 100644
--- a/target.c
+++ b/target.c
@@ -181,6 +181,9 @@ void target_init(void)
arch_target = target;
arch_mach = target->mach;
+ if (fpie > fpic)
+ fpic = fpie;
+
if (target->wchar)
wchar_ctype = target->wchar;
if (target->wint)
@@ -192,4 +195,11 @@ void target_init(void)
if (target->init)
target->init(target);
+
+ if (arch_msize_long) {
+ size_t_ctype = &ulong_ctype;
+ ssize_t_ctype = &long_ctype;
+ }
+ if (fshort_wchar)
+ wchar_ctype = &ushort_ctype;
}