Skip to content

Commit

Permalink
Implement __builtin_constant_p
Browse files Browse the repository at this point in the history
  • Loading branch information
larmel committed Jul 10, 2021
1 parent 7985203 commit ebb0326
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 0 deletions.
24 changes: 24 additions & 0 deletions src/parser/builtin.c
Expand Up @@ -6,11 +6,34 @@
#include "declaration.h"
#include "eval.h"
#include "expression.h"
#include "parse.h"
#include "symtab.h"
#include "typetree.h"
#include <lacc/context.h>
#include <lacc/token.h>

/*
* Return 1 iff expression is a constant.
*
* No actual evaluation is performed.
*/
static struct block *parse__builtin_constant_p(
struct definition *def,
struct block *block)
{
struct var v;
struct block *head, *tail;

head = cfg_block_init(NULL);
consume('(');
tail = assignment_expression(NULL, head);
consume(')');

v = var_int(tail == head && is_immediate(tail->expr));
block->expr = as_expr(v);
return block;
}

/*
* Parse call to builtin symbol __builtin_va_start, which is the result
* of calling va_start(arg, s). Return type depends on second input
Expand Down Expand Up @@ -182,6 +205,7 @@ INTERNAL void register_builtins(void)
sym_create_builtin(str_c("__builtin_alloca"), parse__builtin_alloca);
sym_create_builtin(str_c("__builtin_va_start"), parse__builtin_va_start);
sym_create_builtin(str_c("__builtin_va_arg"), parse__builtin_va_arg);
sym_create_builtin(str_c("__builtin_constant_p"), parse__builtin_constant_p);

declare_memcpy();
}
18 changes: 18 additions & 0 deletions test/extensions/__builtin_constant_p.c
@@ -0,0 +1,18 @@
#include <assert.h>

#define init(x) (__builtin_constant_p(x) ? x : -1)

int a = 5;

static int data[] = {
init(3 + 9),
init(8 - a),
init(0 ? a : 4)
};

int main(void) {
assert(data[0] == 12);
assert(data[1] == -1);
assert(data[2] == 4);
return 1;
}

0 comments on commit ebb0326

Please sign in to comment.