I noticed while debugging another issue that at some point I'd broken the source locations that toyvm.c sets up into the .toy source files, by using the filename, rather than the filesystem path.
Also fix a segfault due to fclose (NULL) when the .toy file is not found. Committed to trunk as r218540. gcc/jit/ChangeLog: * docs/examples/tut04-toyvm/toyvm.c (toyvm_function_compile): Move logic for determine "funcname" to new function... (get_function_name): ...here, adding logic to skip any leading path from the filename. (toyvm_function_parse): Use the filename for fn_filename, rather than "name", so that the debugger can locate the source .toy file. (toyvm_function_parse): Don't fclose a NULL FILE *. --- gcc/jit/docs/examples/tut04-toyvm/toyvm.c | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/gcc/jit/docs/examples/tut04-toyvm/toyvm.c b/gcc/jit/docs/examples/tut04-toyvm/toyvm.c index 07de507..0089ea7 100644 --- a/gcc/jit/docs/examples/tut04-toyvm/toyvm.c +++ b/gcc/jit/docs/examples/tut04-toyvm/toyvm.c @@ -121,6 +121,25 @@ add_unary_op (toyvm_function *fn, enum opcode opcode, add_op (fn, opcode, operand, linenum); } +static char * +get_function_name (const char *filename) +{ + /* Skip any path separators. */ + const char *pathsep = strrchr (filename, '/'); + if (pathsep) + filename = pathsep + 1; + + /* Copy filename to funcname. */ + char *funcname = (char *)malloc (strlen (filename) + 1); + + strcpy (funcname, filename); + + /* Convert "." to NIL terminator. */ + *(strchr (funcname, '.')) = '\0'; + + return funcname; +} + static toyvm_function * toyvm_function_parse (const char *filename, const char *name) { @@ -149,7 +168,7 @@ toyvm_function_parse (const char *filename, const char *name) fprintf (stderr, "out of memory allocating toyvm_function\n"); goto error; } - fn->fn_filename = name; + fn->fn_filename = filename; /* Read the lines of the file. */ while ((linelen = getline (&line, &bufsize, f)) != -1) @@ -208,7 +227,8 @@ toyvm_function_parse (const char *filename, const char *name) error: free (line); - fclose (f); + if (f) + fclose (f); free (fn); return NULL; } @@ -460,12 +480,7 @@ toyvm_function_compile (toyvm_function *fn) memset (&state, 0, sizeof (state)); - /* Copy filename to funcname. */ - funcname = (char *)malloc (strlen (fn->fn_filename) + 1); - strcpy (funcname, fn->fn_filename); - - /* Convert "." to NIL terminator. */ - *(strchr (funcname, '.')) = '\0'; + funcname = get_function_name (fn->fn_filename); state.ctxt = gcc_jit_context_acquire (); -- 1.8.5.3