From 07ca02cc2d0a2137433f29186aa838d68ded7e9a Mon Sep 17 00:00:00 2001 From: Michael Forney Date: Tue, 16 Apr 2019 16:45:14 -0700 Subject: Implement __builtin_types_compatible_p This is used by util-linux. --- cc.h | 1 + expr.c | 5 +++++ scope.c | 2 ++ test/builtin-types-compatible-p.c | 3 +++ test/builtin-types-compatible-p.qbe | 3 +++ 5 files changed, 14 insertions(+) create mode 100644 test/builtin-types-compatible-p.c create mode 100644 test/builtin-types-compatible-p.qbe diff --git a/cc.h b/cc.h index 6cf3f94..80cf344 100644 --- a/cc.h +++ b/cc.h @@ -239,6 +239,7 @@ enum builtinkind { BUILTININFF, BUILTINNANF, BUILTINOFFSETOF, + BUILTINTYPESCOMPATIBLEP, BUILTINVAARG, BUILTINVACOPY, BUILTINVAEND, diff --git a/expr.c b/expr.c index 28585c9..5c3e688 100644 --- a/expr.c +++ b/expr.c @@ -442,6 +442,11 @@ builtinfunc(struct scope *s, enum builtinkind kind) e = mkconstexpr(&typeulong, offset); free(name); break; + case BUILTINTYPESCOMPATIBLEP: + t = typename(s, NULL); + expect(TCOMMA, "after type name"); + e = mkconstexpr(&typeint, typecompatible(t, typename(s, NULL))); + break; case BUILTINVAARG: e = mkexpr(EXPRBUILTIN, NULL); e->builtin.kind = BUILTINVAARG; diff --git a/scope.c b/scope.c index 1dc9f5c..f7207d1 100644 --- a/scope.c +++ b/scope.c @@ -20,6 +20,8 @@ scopeinit(void) {"__builtin_inff", {.kind = DECLBUILTIN, .builtin = BUILTININFF}}, {"__builtin_nanf", {.kind = DECLBUILTIN, .builtin = BUILTINNANF}}, {"__builtin_offsetof", {.kind = DECLBUILTIN, .builtin = BUILTINOFFSETOF}}, + {"__builtin_types_compatible_p", + {.kind = DECLBUILTIN, .builtin = BUILTINTYPESCOMPATIBLEP}}, {"__builtin_va_arg", {.kind = DECLBUILTIN, .builtin = BUILTINVAARG}}, {"__builtin_va_copy", {.kind = DECLBUILTIN, .builtin = BUILTINVACOPY}}, {"__builtin_va_end", {.kind = DECLBUILTIN, .builtin = BUILTINVAEND}}, diff --git a/test/builtin-types-compatible-p.c b/test/builtin-types-compatible-p.c new file mode 100644 index 0000000..23631ce --- /dev/null +++ b/test/builtin-types-compatible-p.c @@ -0,0 +1,3 @@ +int x = __builtin_types_compatible_p(unsigned, enum {A}); +int y = __builtin_types_compatible_p(const int, int); /* qualifiers are ignored */ +int z = __builtin_types_compatible_p(int *, unsigned *); diff --git a/test/builtin-types-compatible-p.qbe b/test/builtin-types-compatible-p.qbe new file mode 100644 index 0000000..cae3e60 --- /dev/null +++ b/test/builtin-types-compatible-p.qbe @@ -0,0 +1,3 @@ +export data $x = align 4 { w 1, } +export data $y = align 4 { w 1, } +export data $z = align 4 { w 0, } -- cgit v1.2.3