blob: 49e8834a0ba16e401c8eff8d9a8ca50f911f0e68 [file] [log] [blame]
/* Essentially this test checks that debug info are generated for globals
locals and functions, including type info. The comment bellow is used
as fake code (does not affect the test, use for manual debugging). */
/*
int a_global_for_test_debuginfo;
int main (int argc, char **argv)
{
int a_local_for_test_debuginfo = 2;
return a_global_for_test_debuginfo + a_local_for_test_debuginfo;
}
*/
#include "libgccjit.h"
/* We don't want set_options() in harness.h to set -O3 so our little local
is optimized away. */
#define TEST_ESCHEWS_SET_OPTIONS
static void set_options (gcc_jit_context *ctxt, const char *argv0)
{
gcc_jit_context_set_bool_option(ctxt, GCC_JIT_BOOL_OPTION_DEBUGINFO, 1);
}
#define TEST_COMPILING_TO_FILE
#define OUTPUT_KIND GCC_JIT_OUTPUT_KIND_EXECUTABLE
#define OUTPUT_FILENAME "jit-debuginfo.o"
#include "harness.h"
#define LOC(row, col) gcc_jit_context_new_location(ctxt, "test-debuginfo.c", row, col)
void
create_code (gcc_jit_context *ctxt, void* p)
{
gcc_jit_type *int_type = gcc_jit_context_get_type(ctxt, GCC_JIT_TYPE_INT);
gcc_jit_lvalue *bar = gcc_jit_context_new_global(ctxt,
LOC(5,1), GCC_JIT_GLOBAL_EXPORTED,
int_type, "a_global_for_test_debuginfo");
gcc_jit_param *argc_para = gcc_jit_context_new_param(ctxt, LOC(6,15),
int_type, "argc");
gcc_jit_param *argv_para = gcc_jit_context_new_param(ctxt, LOC(6,28),
gcc_jit_type_get_pointer(
gcc_jit_type_get_pointer(
gcc_jit_context_get_type(ctxt, GCC_JIT_TYPE_CHAR))),
"argc");
gcc_jit_param *params[] = {argc_para, argv_para};
gcc_jit_function *foo_fn = gcc_jit_context_new_function(ctxt, LOC(6,5),
GCC_JIT_FUNCTION_EXPORTED, int_type, "main", 2, params, 0);
gcc_jit_block *start_block = gcc_jit_function_new_block(foo_fn,
"start_block");
gcc_jit_lvalue *a = gcc_jit_function_new_local(foo_fn, LOC(8,5),
int_type, "a_local_for_test_debuginfo");
gcc_jit_block_add_assignment(start_block, LOC(8,36), a,
gcc_jit_context_new_rvalue_from_int(ctxt, int_type, 2));
gcc_jit_rvalue *add = gcc_jit_context_new_binary_op(ctxt, LOC(9,40),
GCC_JIT_BINARY_OP_PLUS, int_type,
gcc_jit_lvalue_as_rvalue(a), gcc_jit_lvalue_as_rvalue(bar));
gcc_jit_block_end_with_return(start_block, LOC(9,5), add);
}
#undef LOC
/* jit-check-debug-info fires up gdb and checks that the variables have
debug info */
/* { dg-final { jit-check-debug-info "jit-debuginfo.o" {"info variables\n"} "int\\s+a_global_for_test_debuginfo;" } } */
/* { dg-final { jit-check-debug-info "jit-debuginfo.o" {"pt main\n"} "int\\s*\\(\\s*int\\s*,\\s*char\\s*\\*\\*\\s*\\)"} } */
/* { dg-final { jit-check-debug-info "jit-debuginfo.o" {"start\n" "info locals\n"} "a_local_for_test_debuginfo"} } */
/* { dg-final { jit-check-debug-info "jit-debuginfo.o" {"start\n" "pt a_local_for_test_debuginfo\n"} "int"} } */