Changes in directory llvm-gcc/gcc:
llvm-expand.c updated: 1.121 -> 1.122 llvm-out.h updated: 1.6 -> 1.7 llvm-representation.c updated: 1.22 -> 1.23 llvm-representation.h updated: 1.21 -> 1.22 toplev.c updated: 1.6 -> 1.7 --- Log message: http://llvm.cs.uiuc.edu/bugs/show_bug.cgi?id=676 Fixes a bug where all debug information showed the main compile unit and not includes. --- Diffs of the changes: (+112 -76) llvm-expand.c | 136 +++++++++++++++++++++++++++++--------------------- llvm-out.h | 4 - llvm-representation.c | 23 ++++++++ llvm-representation.h | 10 +++ toplev.c | 15 ----- 5 files changed, 112 insertions(+), 76 deletions(-) Index: llvm-gcc/gcc/llvm-expand.c diff -u llvm-gcc/gcc/llvm-expand.c:1.121 llvm-gcc/gcc/llvm-expand.c:1.122 --- llvm-gcc/gcc/llvm-expand.c:1.121 Wed Dec 7 13:35:10 2005 +++ llvm-gcc/gcc/llvm-expand.c Fri Dec 16 16:17:32 2005 @@ -7834,7 +7834,6 @@ static llvm_type *emptyStructTy; static llvm_type *ptrToEmptyStructTy; -static llvm_global *dbCompileUnitGlobal; static llvm_global *dbTranslationUnitsGlobal; static llvm_global *dbGlobalsGlobal; @@ -7881,62 +7880,85 @@ emits file level debug info as LLVM globals */ -void llvm_emit_debug_context_info(const char *fileName, - const char *path, - const char *producer){ - llvm_constant *CA = 0; - llvm_global *pathStr = EmitGlobalString(fileName); - llvm_global *fileNameStr = EmitGlobalString(path); - llvm_global *producerStr = EmitGlobalString(producer); - llvm_value **Elements = (llvm_value**) xcalloc(7, sizeof(llvm_value*)); - llvm_instruction *gep = 0; - - /* Infer language of file, stolen from dwarf2out.c */ - const char *language_string = lang_hooks.name; - if (strcmp (language_string, "GNU C++") == 0) - LLVM_DEBUG_LANG_CODE = 0x0004; /*DW_LANG_C_plus_plus;*/ - else if (strcmp (language_string, "GNU Ada") == 0) - LLVM_DEBUG_LANG_CODE = 0x000d; /* DW_LANG_Ada95; */ - else if (strcmp (language_string, "GNU F77") == 0) - LLVM_DEBUG_LANG_CODE = 0x0007; /* DW_LANG_Fortran77; */ - else if (strcmp (language_string, "GNU Pascal") == 0) - LLVM_DEBUG_LANG_CODE = 0x0009; /* DW_LANG_Pascal83; */ - else if (strcmp (language_string, "GNU Java") == 0) - LLVM_DEBUG_LANG_CODE = 0x000b; /* DW_LANG_Java; */ - else - LLVM_DEBUG_LANG_CODE = 0x0001; /* DW_LANG_C89; */ - - - /* The constant in Elements[0] is DW_TAG_COMPILE_UNIT */ - Elements[0] = llvm_constant_new_integral(UIntTy, 17); - Elements[1] = llvm_constant_new_integral(UShortTy, LLVM_DEBUG_VERSION); - Elements[2] = llvm_constant_new_integral(UShortTy, LLVM_DEBUG_LANG_CODE); +llvm_global *llvm_emit_debug_context_info(const char *fullpath) { + llvm_global *dbCompileUnitGlobal = NULL; - gep = create_gep3(G2V(fileNameStr), - llvm_constant_intptr_0, - llvm_constant_intptr_0); - Elements[3] = G2V(llvm_constant_expr_new(gep)); - - gep = create_gep3(G2V(pathStr), - llvm_constant_intptr_0, - llvm_constant_intptr_0); - Elements[4] = G2V(llvm_constant_expr_new(gep)); - - gep = create_gep3(G2V(producerStr), - llvm_constant_intptr_0, - llvm_constant_intptr_0); - Elements[5] = G2V(llvm_constant_expr_new(gep)); - - Elements[6] = G2V(dbTranslationUnitsGlobal); - CA = G2C(llvm_constant_aggregate_new(dbCompileUnitTy, Elements)); - - dbCompileUnitGlobal = llvm_global_new(dbCompileUnitTy, "d.compile_unit"); - dbCompileUnitGlobal->isConstant = 1; - dbCompileUnitGlobal->Linkage = L_Internal; - dbCompileUnitGlobal->Init = CA; + if (debug_info_level > DINFO_LEVEL_NONE) { + const char *globalName; + llvm_global *pathStr; + llvm_global *fileNameStr; + llvm_global *producerStr; + llvm_constant *CA = 0; + llvm_value **Elements = (llvm_value**) xcalloc(7, sizeof(llvm_value*)); + llvm_instruction *gep = 0; + static compileUnitCount = 0; + char *buf = xstrdup(fullpath); + char *path = buf; + char *fileName = strrchr(buf, '/'); + + if(fileName){ + *fileName = '\0'; + fileName++; + } else { + path = "."; + fileName = buf; + } - llvm_ilist_push_back(llvm_global, TheProgram.Globals, dbCompileUnitGlobal); + pathStr = EmitGlobalString(path); + fileNameStr = EmitGlobalString(fileName); + producerStr = EmitGlobalString("3.4.x"); + free(buf); + + /* Infer language of file, stolen from dwarf2out.c */ + const char *language_string = lang_hooks.name; + if (strcmp (language_string, "GNU C++") == 0) + LLVM_DEBUG_LANG_CODE = 0x0004; /*DW_LANG_C_plus_plus;*/ + else if (strcmp (language_string, "GNU Ada") == 0) + LLVM_DEBUG_LANG_CODE = 0x000d; /* DW_LANG_Ada95; */ + else if (strcmp (language_string, "GNU F77") == 0) + LLVM_DEBUG_LANG_CODE = 0x0007; /* DW_LANG_Fortran77; */ + else if (strcmp (language_string, "GNU Pascal") == 0) + LLVM_DEBUG_LANG_CODE = 0x0009; /* DW_LANG_Pascal83; */ + else if (strcmp (language_string, "GNU Java") == 0) + LLVM_DEBUG_LANG_CODE = 0x000b; /* DW_LANG_Java; */ + else + LLVM_DEBUG_LANG_CODE = 0x0001; /* DW_LANG_C89; */ + + + /* The constant in Elements[0] is DW_TAG_COMPILE_UNIT */ + Elements[0] = llvm_constant_new_integral(UIntTy, 17); + Elements[1] = llvm_constant_new_integral(UShortTy, LLVM_DEBUG_VERSION); + Elements[2] = llvm_constant_new_integral(UShortTy, LLVM_DEBUG_LANG_CODE); + + gep = create_gep3(G2V(fileNameStr), + llvm_constant_intptr_0, + llvm_constant_intptr_0); + Elements[3] = G2V(llvm_constant_expr_new(gep)); + + gep = create_gep3(G2V(pathStr), + llvm_constant_intptr_0, + llvm_constant_intptr_0); + Elements[4] = G2V(llvm_constant_expr_new(gep)); + + gep = create_gep3(G2V(producerStr), + llvm_constant_intptr_0, + llvm_constant_intptr_0); + Elements[5] = G2V(llvm_constant_expr_new(gep)); + + Elements[6] = G2V(dbTranslationUnitsGlobal); + CA = G2C(llvm_constant_aggregate_new(dbCompileUnitTy, Elements)); + + asprintf(&globalName, "d.compile_unit.%d", ++compileUnitCount); + + dbCompileUnitGlobal = llvm_global_new(dbCompileUnitTy, globalName); + dbCompileUnitGlobal->isConstant = 1; + dbCompileUnitGlobal->Linkage = L_Internal; + dbCompileUnitGlobal->Init = CA; + llvm_ilist_push_back(llvm_global, TheProgram.Globals, dbCompileUnitGlobal); + } + + return dbCompileUnitGlobal; } /* llvm_emit_dbg_function_info emits a global of type lldb.global @@ -7948,6 +7970,7 @@ static void llvm_emit_dbg_function_info(llvm_function *Fn) { char *func_name = G2V(Fn)->Name; char *gFuncName = 0; + const char *sourcePath = DECL_SOURCE_FILE(current_function_decl); llvm_constant *CA = 0; llvm_global *funcNameStr = 0; @@ -7962,7 +7985,7 @@ funcNameStr = EmitGlobalString(func_name); Elements = (llvm_value**) xcalloc(7, sizeof(llvm_value*)); Elements[0] = llvm_constant_new_integral(UIntTy, 46); /* DW_TAG_subprogram */ - Elements[1] = G2V(dbCompileUnitGlobal); + Elements[1] = G2V(llvm_register_source(sourcePath)->Global); gep = create_gep3(G2V(funcNameStr), llvm_constant_intptr_0, @@ -8020,7 +8043,6 @@ * and global object anchors. */ void InitDebuggerTypeDecls(void){ - llvm_type *ptrToSByteTy; unsigned ptrTySz, uIntTySz, uShortTySz, boolTySz; unsigned dbCompileUnitSz; @@ -8203,7 +8225,7 @@ stoppoint_inst->Operands[2] = llvm_constant_new_integral(UIntTy, lineNo); stoppoint_inst->Operands[3] = llvm_constant_new_integral(UIntTy, colNo); - stoppoint_inst->Operands[4] = G2V(dbCompileUnitGlobal); + stoppoint_inst->Operands[4]=G2V(llvm_register_source(input_filename)->Global); append_inst(Fn, load_dbg_inst); append_inst(Fn, stoppoint_inst); Index: llvm-gcc/gcc/llvm-out.h diff -u llvm-gcc/gcc/llvm-out.h:1.6 llvm-gcc/gcc/llvm-out.h:1.7 --- llvm-gcc/gcc/llvm-out.h:1.6 Fri Jul 22 13:51:11 2005 +++ llvm-gcc/gcc/llvm-out.h Fri Dec 16 16:17:32 2005 @@ -44,10 +44,6 @@ the command line, possibly NULL. */ void llvm_init_asm_output(const char *Filename); -/* emit global debug info for the file */ -void llvm_emit_debug_context_info(const char *fileName, const char *path, - const char *producer); - /* llvm_assemble_external - This function is called once for each external * function and variable as they are used. */ Index: llvm-gcc/gcc/llvm-representation.c diff -u llvm-gcc/gcc/llvm-representation.c:1.22 llvm-gcc/gcc/llvm-representation.c:1.23 --- llvm-gcc/gcc/llvm-representation.c:1.22 Sun Dec 4 22:49:21 2005 +++ llvm-gcc/gcc/llvm-representation.c Fri Dec 16 16:17:32 2005 @@ -859,6 +859,29 @@ llvm_instruction_print, F); } +/* llvm_source_path implementation ******************************************** + */ +llvm_source_path *llvm_register_source(const char *SourceStr) { + llvm_source_path *Entry; + static llvm_source_path *Registry = NULL; + static llvm_source_path *Cache = NULL; + + if (Cache && strcmp(Cache->SourceStr, SourceStr) == 0) return Cache; + + for (Entry = Registry; Entry; Entry = Entry->Next) { + if (strcmp(Entry->SourceStr, SourceStr) == 0) { + Cache = Entry; + return Cache; + } + } + + Cache = (llvm_source_path*)xcalloc(sizeof(llvm_source_path), 1); + Cache->SourceStr = SourceStr; + Cache->Global = llvm_emit_debug_context_info(SourceStr); + Cache->Next = Registry; + Registry = Cache; + return Cache; +} /* llvm_function implementation ******************************************** */ Index: llvm-gcc/gcc/llvm-representation.h diff -u llvm-gcc/gcc/llvm-representation.h:1.21 llvm-gcc/gcc/llvm-representation.h:1.22 --- llvm-gcc/gcc/llvm-representation.h:1.21 Sun Dec 4 22:49:21 2005 +++ llvm-gcc/gcc/llvm-representation.h Fri Dec 16 16:17:33 2005 @@ -266,6 +266,16 @@ L_Internal /* Static function? */ }; +struct llvm_global; +typedef struct llvm_source_path { + const char *SourceStr; + struct llvm_global *Global; + struct llvm_source_path *Next; +} llvm_source_path; + +llvm_source_path *llvm_register_source(const char *SourceStr); +struct llvm_global *llvm_emit_debug_context_info(const char *fullpath); + struct llvm_expand_info; typedef struct llvm_function { llvm_constant ConstantBase; Index: llvm-gcc/gcc/toplev.c diff -u llvm-gcc/gcc/toplev.c:1.6 llvm-gcc/gcc/toplev.c:1.7 --- llvm-gcc/gcc/toplev.c:1.6 Thu Nov 18 14:44:23 2004 +++ llvm-gcc/gcc/toplev.c Fri Dec 16 16:17:33 2005 @@ -4409,21 +4409,6 @@ if (EMIT_LLVM) { llvm_init_codegen(); - if (debug_info_level > DINFO_LEVEL_NONE) { - char *buf = xstrdup(name); - char *path = buf; - char *fileName = strrchr(buf, '/'); - if(fileName){ - *fileName = '\0'; - fileName++; - }else{ - path = "."; - fileName = buf; - } - - llvm_emit_debug_context_info(path, fileName, "llvm 3.4.x"); - free(buf); - } } /* Other front-end initialization. */ _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits