This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Basic frontend framework: Segfault on append_to_statement_list
- From: "Rehno Lindeque" <errantkid at gmail dot com>
- To: gcc at gcc dot gnu dot org
- Date: Mon, 16 Jul 2007 18:39:03 +0200
- Subject: 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