summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2017-12-09 13:36:54 +0100
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2018-12-14 00:40:52 +0100
commit2527752a81b65174113aae5dc4ad17b90cf7255a (patch)
treee3b37d702be75b83c3802400a1fa6943ab06ee85
parentb6f0362baae2c8fdd5ef42eaae3bb05f8bcd8fea (diff)
downloadsparse-2527752a81b65174113aae5dc4ad17b90cf7255a.tar.gz
fix '__SIZE_TYPE__' for LLP64
size_t_ctype is set to uint, ulong or ullong, depending on the architecture (ullong is only used for LLP64). However, when emitting '__SIZE_TYPE__', it's only compared to ulong or uint. Fix this by using an small helper directly using the right struct symbol * and using builtin_typename() to output the right type. This way we're guaranteed that '__SIZE_TYPE__' is kept coherent with the internal type: size_t_ctype. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r--lib.c17
-rw-r--r--validation/preprocessor/predef-llp64.c1
2 files changed, 7 insertions, 11 deletions
diff --git a/lib.c b/lib.c
index e205eb21..9d3ac2af 100644
--- a/lib.c
+++ b/lib.c
@@ -1156,6 +1156,12 @@ static void predefined_type_size(const char *name, const char *suffix, unsigned
predefined_width(name, bits);
}
+static void predefined_type(const char *name, struct symbol *type)
+{
+ const char *typename = builtin_typename(type);
+ add_pre_buffer("#weak_define __%s_TYPE__ %s\n", name, typename);
+}
+
static void predefined_macros(void)
{
predefine("__CHECKER__", 0, "1");
@@ -1249,16 +1255,7 @@ static void create_builtin_stream(void)
// Temporary hack
add_pre_buffer("#define _Pragma(x)\n");
- // gcc defines __SIZE_TYPE__ to be size_t. For linux/i86 and
- // solaris/sparc that is really "unsigned int" and for linux/x86_64
- // it is "long unsigned int". In either case we can probably
- // get away with this. We need the #weak_define as cgcc will define
- // the right __SIZE_TYPE__.
- if (size_t_ctype == &ulong_ctype)
- add_pre_buffer("#weak_define __SIZE_TYPE__ long unsigned int\n");
- else
- add_pre_buffer("#weak_define __SIZE_TYPE__ unsigned int\n");
-
+ predefined_type("SIZE", size_t_ctype);
/* add the multiarch include directories, if any */
if (multiarch_dir && *multiarch_dir) {
diff --git a/validation/preprocessor/predef-llp64.c b/validation/preprocessor/predef-llp64.c
index a34b51b3..0a758690 100644
--- a/validation/preprocessor/predef-llp64.c
+++ b/validation/preprocessor/predef-llp64.c
@@ -3,7 +3,6 @@
/*
* check-name: predefined macros for LLP64
* check-command: test-linearize -Wno-decl -msize-llp64 $file
- * check-known-to-fail
* check-output-ignore
*
* check-output-contains: ret\\..*\\$0