This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Basic frontend framework: Segfault on append_to_statement_list


I'm struggling a lot to get a basic frontend up and running. It
segfaults on append_to_statement_list(...) when the function tries to
get the statement list's tail iterator (via STATEMENT_LIST_TAIL(...)).
This is of course after I have called alloc_stmt_list(...).

Can anyone point to _anything_ at all I might be missing?

GCC base is 4.2.0. For reference, this is my basic parse function:

///////////////// START OF CODE /////////////////

tree build_function_decl (const char *name, bool external, tree function_type)
{
 tree function_decl;

 function_decl                   = build_fn_decl(name, function_type);
 DECL_EXTERNAL(function_decl)    = external;
 DECL_ARTIFICIAL(function_decl)  = false;
 TREE_STATIC(function_decl)      = !external;
 DECL_CONTEXT(function_decl)     = NULL_TREE;

 return function_decl;
}

void build_function(tree function_decl, tree stmt_list, tree block)
{
 tree result_decl;

 DECL_INITIAL(function_decl)     = block;
 DECL_SAVED_TREE(function_decl)  = build3(BIND_EXPR, void_type_node,
BLOCK_VARS(block), stmt_list, block);

 result_decl                 = build_decl(RESULT_DECL, NULL_TREE,
integer_type_node);
 DECL_CONTEXT(result_decl)   = function_decl;
 DECL_RESULT(function_decl)  = result_decl;

 allocate_struct_function(function_decl);
}

void experimental_parse_file(int debug)
{
 /* Build main function */

const char* const message = "Welcome to Experimental!";

tree welcome_string_literal;

 tree main_function_type;
 tree main_function_decl;
 tree main_function_block;
 tree main_function_stmt_list;

 tree puts_function_type;
 tree puts_function_decl;
 tree char_pointer;

 tree puts_function_call;
 tree puts_function_args;

 /* Build main function (and call puts (builtin??) function) */
 /* Build puts function declaration: int puts(char*); */
 char_pointer        = build_pointer_type(char_type_node);
 puts_function_type  = build_function_type_list(integer_type_node,
char_pointer, NULL_TREE);
 puts_function_decl  = build_function_decl("puts", true, puts_function_type);

 /* Build main function declaration: int main(); */
 main_function_type = build_function_type_list(integer_type_node, NULL_TREE);
 main_function_decl = build_function_decl("main", false, main_function_type);
 DECL_SOURCE_FILE(main_function_decl) = main_input_filename;
 DECL_SOURCE_LINE(main_function_decl) = 1;

 main_function_block     = build_block(NULL_TREE, NULL_TREE,
NULL_TREE, NULL_TREE);
 main_function_stmt_list = alloc_stmt_list();

 welcome_string_literal  = build_string_literal(strlen(message) + 1, message);
 puts_function_args      = tree_cons(NULL_TREE,
welcome_string_literal, NULL_TREE);
 puts_function_call      =
build_function_call_expr(puts_function_decl, puts_function_args);

 /***     ERROR: SEGFAULT OCCURS HERE!     ***/
 append_to_statement_list(puts_function_call, &main_function_stmt_list);

 build_function(main_function_decl, main_function_stmt_list,
main_function_block);

 /* Process trees */
 gimplify_function_tree(main_function_decl);
 cgraph_finalize_function(main_function_decl, false);
 cgraph_finalize_compilation_unit();
 cgraph_optimize();
}

///////////////// END OF CODE /////////////////

Kind regards,
Rehno Lindeque


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]