+Driver:
+- add an -std= option (for c99, gnu99, ms at least)
+
Refactoring:
- eliminate target_architecture.h and replace with stuff in lang_features.h
- redo storage classes: so we can separate real from declared storage class
case EXPR_SIZEOF:
case EXPR_CLASSIFY_TYPE:
case EXPR_FUNCTION:
+ case EXPR_FUNCSIG:
+ case EXPR_FUNCDNAME:
case EXPR_PRETTY_FUNCTION:
case EXPR_OFFSETOF:
case EXPR_ALIGNOF:
static const declaration_t *current_function_decl;
static ir_node *current_function_name;
+static ir_node *current_funcsig;
static struct obstack asm_obst;
return current_function_name;
}
+static ir_node *funcsig_to_firm(
+ const string_literal_expression_t *const expr)
+{
+ if (current_funcsig == NULL) {
+ const source_position_t *const src_pos = &expr->base.source_position;
+ ir_entity *ent = get_irg_entity(current_ir_graph);
+ const char *const name = get_entity_ld_name(ent);
+ const string_t string = { name, strlen(name) + 1 };
+ current_funcsig = string_to_firm(src_pos, "__FUNCSIG__", &string);
+ }
+
+ return current_funcsig;
+}
+
static ir_node *statement_expression_to_firm(const statement_expression_t *expr)
{
statement_t *statement = expr->statement;
return classify_type_to_firm(&expression->classify_type);
case EXPR_FUNCTION:
case EXPR_PRETTY_FUNCTION:
+ case EXPR_FUNCDNAME:
return function_name_to_firm(&expression->string);
+ case EXPR_FUNCSIG:
+ return funcsig_to_firm(&expression->string);
case EXPR_STATEMENT:
return statement_expression_to_firm(&expression->statement);
case EXPR_VA_START:
case EXPR_WIDE_STRING_LITERAL:
case EXPR_FUNCTION:
case EXPR_PRETTY_FUNCTION:
+ case EXPR_FUNCSIG:
+ case EXPR_FUNCDNAME:
case EXPR_BUILTIN_SYMBOL:
case EXPR_VA_START:
case EXPR_VA_ARG:
current_function_decl = declaration;
current_function_name = NULL;
+ current_funcsig = NULL;
assert(imature_blocks == NULL);
imature_blocks = NEW_ARR_F(ir_node*, 0);
while(true) {
if(token.type != T_IDENTIFIER)
break;
- symbol_t *symbol = token.v.symbol;
+ symbol_t *sym = token.v.symbol;
+ if(sym == sym_deprecated) {
+ }
next_token();
if(token.type == '(')
eat_until_matching_token('(');
case EXPR_FUNCTION: return false;
case EXPR_PRETTY_FUNCTION: return false;
+ case EXPR_FUNCSIG: return false;
+ case EXPR_FUNCDNAME: return false;
case EXPR_BUILTIN_SYMBOL: break; /* handled in EXPR_CALL */
case EXPR_BUILTIN_CONSTANT_P: return false;
case EXPR_BUILTIN_PREFETCH: return true;
assert(size < 32);
atomic_type_kind_t kind = kinds[size];
if(kind == ATOMIC_TYPE_INVALID) {
- static const possible_kinds[] = {
+ static const atomic_type_kind_t possible_kinds[] = {
ATOMIC_TYPE_SCHAR,
ATOMIC_TYPE_SHORT,
ATOMIC_TYPE_INT,
ATOMIC_TYPE_LONG,
ATOMIC_TYPE_LONGLONG
};
- for(int i = 0; i < sizeof(possible_kinds)/sizeof(possible_kinds[0]); ++i) {
+ for(unsigned i = 0; i < sizeof(possible_kinds)/sizeof(possible_kinds[0]); ++i) {
if(get_atomic_type_size(possible_kinds[i]) == size) {
kind = possible_kinds[i];
break;
assert(size < 32);
atomic_type_kind_t kind = kinds[size];
if(kind == ATOMIC_TYPE_INVALID) {
- static const possible_kinds[] = {
+ static const atomic_type_kind_t possible_kinds[] = {
ATOMIC_TYPE_UCHAR,
ATOMIC_TYPE_USHORT,
ATOMIC_TYPE_UINT,
ATOMIC_TYPE_ULONG,
ATOMIC_TYPE_ULONGLONG
};
- for(int i = 0; i < sizeof(possible_kinds)/sizeof(possible_kinds[0]); ++i) {
+ for(unsigned i = 0; i < sizeof(possible_kinds)/sizeof(possible_kinds[0]); ++i) {
if(get_atomic_type_size(possible_kinds[i]) == size) {
kind = possible_kinds[i];
break;