杨勇勇
2014-Feb-18 08:44 UTC
[LLVMdev] How is variable info retrieved in debugging for executables generated by llvm backend?
Hi, all I ported llvm backend and lldb recently. Both tools can basically work. lldb is able to debug programs in asm style and frame unwinding is OK. But "frame variable XX" does not work because lldb is not able to determine the address of XX from debug info. Can someone give any clue? Thanks in advance. -- 杨勇勇 (Yang Yong-Yong) -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140218/53ae8de2/attachment.html>
Greg Clayton
2014-Feb-18 18:28 UTC
[LLVMdev] [lldb-dev] How is variable info retrieved in debugging for executables generated by llvm backend?
All of this information is contained in the DWARF debug info that you must generate. Are you generating DWARF? If not, you will need to. If so, please attach an example program that contains DWARF and specify which function you are having trouble getting variable information for. Greg Clayton On Feb 18, 2014, at 12:44 AM, 杨勇勇 <triple.yang at gmail.com> wrote:> Hi, all > > I ported llvm backend and lldb recently. Both tools can basically work. > lldb is able to debug programs in asm style and frame unwinding is OK. > > But "frame variable XX" does not work because lldb is not able to determine the address of > XX from debug info. > > Can someone give any clue? > Thanks in advance. > > -- > 杨勇勇 (Yang Yong-Yong) > _______________________________________________ > lldb-dev mailing list > lldb-dev at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev
杨勇勇
2014-Feb-19 07:08 UTC
[LLVMdev] [lldb-dev] How is variable info retrieved in debugging for executables generated by llvm backend?
Thank you. Here is an example and the attchment contains extra files including object file and executable file. I want to print for example the value of "a", but lldb command "frame variable a" displays "0" and so does "b", and "c". Meanwhile, the value is correct if I directly check registers or memory. Following content is composed of three part: 1. C program. 2. assembly file including directives of dwarf debug info. 3. dwarf debug info dumpped from executable file with llvm-dwarfdump. /////////////////////////////////////////////////////////////////////////////////////////// // C int main(int argc, char *argv[]) { int a = 11; int b = 22; int c = a+b; return c; } ###################################### # asm including dwarf debugging info .file "test.c" .section .debug_info,"", at progbits Lsection_info: .section .debug_abbrev,"", at progbits Lsection_abbrev: .section .debug_aranges,"", at progbits .section .debug_macinfo,"", at progbits .section .debug_line,"", at progbits Lsection_line: .section .debug_loc,"", at progbits .section .debug_pubtypes,"", at progbits .section .debug_str,"MS", at progbits,1 Linfo_string: .section .debug_ranges,"", at progbits Ldebug_range: .section .debug_loc,"", at progbits Lsection_debug_loc: .text Ltext_begin: .data .file 1 "test.c" .text .global main .type main, at function main: # @main Lfunc_begin0: .loc 1 3 0 # test.c:3:0 # BB#0: # %entry .loc 1 2 0 prologue_end # test.c:2:0 [SP + -4] = FP;; [SP + -8] = J30;; FP = SP;; J31 = -40;; SP = SP + J31;; #DEBUG_VALUE: main:argc <- undef #DEBUG_VALUE: main:argv <- undef R2 = 0;; R3 = 11;; [FP + -12] = R2;; [FP + -16] = R0;; [FP + -20] = R1;; .loc 1 4 0 # test.c:4:0 [FP + -24] = R3;; R2 = 22;; .loc 1 5 0 # test.c:5:0 [FP + -28] = R2;; .loc 1 6 0 # test.c:6:0 R3 = [FP + -24];; R2 = R3 + R2 (T);; [FP + -32] = R2;; .loc 1 7 0 # test.c:7:0 [FP + -36] = R0;; R0 = R2;; [FP + -40] = R1;; SP = FP;; J30 = [SP + -8];; FP = [SP + -4];; jump J30;; Ltmp0: Ltmp1: .size main, Ltmp1-main Lfunc_end0: Ltext_end: .data Ldata_end: .text Lsection_end1: .section .debug_info,"", at progbits L.debug_info_begin0: .int 148 # Length of Compilation Unit Info .short 2 # DWARF version number .int L.debug_abbrev_begin # Offset Into Abbrev. Section .byte 4 # Address Size (in bytes) .byte 1 # Abbrev [1] 0xb:0x8d DW_TAG_compile_unit .int Linfo_string0 # DW_AT_producer .short 12 # DW_AT_language .int Linfo_string1 # DW_AT_name .int 0 # DW_AT_low_pc .int Lsection_line # DW_AT_stmt_list .int Linfo_string2 # DW_AT_comp_dir .byte 2 # Abbrev [2] 0x22:0x5d DW_TAG_subprogram .int Linfo_string3 # DW_AT_name .byte 1 # DW_AT_decl_file .byte 2 # DW_AT_decl_line # DW_AT_prototyped .int 127 # DW_AT_type # DW_AT_external .int Lfunc_begin0 # DW_AT_low_pc .int Lfunc_end0 # DW_AT_high_pc .byte 2 # DW_AT_frame_base .byte 144 .byte 60 .byte 3 # Abbrev [3] 0x38:0xe DW_TAG_formal_parameter .int Linfo_string5 # DW_AT_name .byte 1 # DW_AT_decl_file .byte 2 # DW_AT_decl_line .int 127 # DW_AT_type .byte 2 # DW_AT_location .byte 145 .byte 24 .byte 3 # Abbrev [3] 0x46:0xe DW_TAG_formal_parameter .int Linfo_string6 # DW_AT_name .byte 1 # DW_AT_decl_file .byte 2 # DW_AT_decl_line .int 146 # DW_AT_type .byte 2 # DW_AT_location .byte 145 .byte 20 .byte 4 # Abbrev [4] 0x54:0xe DW_TAG_variable .int Linfo_string8 # DW_AT_name .byte 1 # DW_AT_decl_file .byte 4 # DW_AT_decl_line .int 127 # DW_AT_type .byte 2 # DW_AT_location .byte 145 .byte 16 .byte 4 # Abbrev [4] 0x62:0xe DW_TAG_variable .int Linfo_string9 # DW_AT_name .byte 1 # DW_AT_decl_file .byte 5 # DW_AT_decl_line .int 127 # DW_AT_type .byte 2 # DW_AT_location .byte 145 .byte 12 .byte 4 # Abbrev [4] 0x70:0xe DW_TAG_variable .int Linfo_string10 # DW_AT_name .byte 1 # DW_AT_decl_file .byte 6 # DW_AT_decl_line .int 127 # DW_AT_type .byte 2 # DW_AT_location .byte 145 .byte 8 .byte 0 # End Of Children Mark .byte 5 # Abbrev [5] 0x7f:0x7 DW_TAG_base_type .int Linfo_string4 # DW_AT_name .byte 5 # DW_AT_encoding .byte 4 # DW_AT_byte_size .byte 5 # Abbrev [5] 0x86:0x7 DW_TAG_base_type .int Linfo_string7 # DW_AT_name .byte 6 # DW_AT_encoding .byte 1 # DW_AT_byte_size .byte 6 # Abbrev [6] 0x8d:0x5 DW_TAG_pointer_type .int 134 # DW_AT_type .byte 6 # Abbrev [6] 0x92:0x5 DW_TAG_pointer_type .int 141 # DW_AT_type .byte 0 # End Of Children Mark L.debug_info_end0: .section .debug_abbrev,"", at progbits L.debug_abbrev_begin: .byte 1 # Abbreviation Code .byte 17 # DW_TAG_compile_unit .byte 1 # DW_CHILDREN_yes .byte 37 # DW_AT_producer .byte 14 # DW_FORM_strp .byte 19 # DW_AT_language .byte 5 # DW_FORM_data2 .byte 3 # DW_AT_name .byte 14 # DW_FORM_strp .byte 17 # DW_AT_low_pc .byte 1 # DW_FORM_addr .byte 16 # DW_AT_stmt_list .byte 6 # DW_FORM_data4 .byte 27 # DW_AT_comp_dir .byte 14 # DW_FORM_strp .byte 0 # EOM(1) .byte 0 # EOM(2) .byte 2 # Abbreviation Code .byte 46 # DW_TAG_subprogram .byte 1 # DW_CHILDREN_yes .byte 3 # DW_AT_name .byte 14 # DW_FORM_strp .byte 58 # DW_AT_decl_file .byte 11 # DW_FORM_data1 .byte 59 # DW_AT_decl_line .byte 11 # DW_FORM_data1 .byte 39 # DW_AT_prototyped .byte 25 # DW_FORM_flag_present .byte 73 # DW_AT_type .byte 19 # DW_FORM_ref4 .byte 63 # DW_AT_external .byte 25 # DW_FORM_flag_present .byte 17 # DW_AT_low_pc .byte 1 # DW_FORM_addr .byte 18 # DW_AT_high_pc .byte 1 # DW_FORM_addr .byte 64 # DW_AT_frame_base .byte 10 # DW_FORM_block1 .byte 0 # EOM(1) .byte 0 # EOM(2) .byte 3 # Abbreviation Code .byte 5 # DW_TAG_formal_parameter .byte 0 # DW_CHILDREN_no .byte 3 # DW_AT_name .byte 14 # DW_FORM_strp .byte 58 # DW_AT_decl_file .byte 11 # DW_FORM_data1 .byte 59 # DW_AT_decl_line .byte 11 # DW_FORM_data1 .byte 73 # DW_AT_type .byte 19 # DW_FORM_ref4 .byte 2 # DW_AT_location .byte 10 # DW_FORM_block1 .byte 0 # EOM(1) .byte 0 # EOM(2) .byte 4 # Abbreviation Code .byte 52 # DW_TAG_variable .byte 0 # DW_CHILDREN_no .byte 3 # DW_AT_name .byte 14 # DW_FORM_strp .byte 58 # DW_AT_decl_file .byte 11 # DW_FORM_data1 .byte 59 # DW_AT_decl_line .byte 11 # DW_FORM_data1 .byte 73 # DW_AT_type .byte 19 # DW_FORM_ref4 .byte 2 # DW_AT_location .byte 10 # DW_FORM_block1 .byte 0 # EOM(1) .byte 0 # EOM(2) .byte 5 # Abbreviation Code .byte 36 # DW_TAG_base_type .byte 0 # DW_CHILDREN_no .byte 3 # DW_AT_name .byte 14 # DW_FORM_strp .byte 62 # DW_AT_encoding .byte 11 # DW_FORM_data1 .byte 11 # DW_AT_byte_size .byte 11 # DW_FORM_data1 .byte 0 # EOM(1) .byte 0 # EOM(2) .byte 6 # Abbreviation Code .byte 15 # DW_TAG_pointer_type .byte 0 # DW_CHILDREN_no .byte 73 # DW_AT_type .byte 19 # DW_FORM_ref4 .byte 0 # EOM(1) .byte 0 # EOM(2) .byte 0 # EOM(3) L.debug_abbrev_end: .section .debug_aranges,"", at progbits .section .debug_ranges,"", at progbits .section .debug_macinfo,"", at progbits .section .debug_str,"MS", at progbits,1 Linfo_string0: .asciz "clang version 3.3 (/opt/git.repo/clang.git/ b422d20530588813b09057b45d5b383f0b175ced) (/opt/git.repo/llvm.git/ 57b428f0a6be7b81bc364b0088992b1f820b516e)" Linfo_string1: .asciz "test.c" Linfo_string2: .asciz "/home/yangyy/workspace/newlib" Linfo_string3: .asciz "main" Linfo_string4: .asciz "int" Linfo_string5: .asciz "argc" Linfo_string6: .asciz "argv" Linfo_string7: .asciz "char" Linfo_string8: .asciz "a" Linfo_string9: .asciz "b" Linfo_string10: .asciz "c" ######################################### # dwarf debug info dumpped from its executable file with llvm-dwarfdump mspu.out: file format ELF32-mspu .debug_abbrev contents: Abbrev table for offset: 0x00000000 [1] DW_TAG_compile_unit DW_CHILDREN_yes DW_AT_producer DW_FORM_strp DW_AT_language DW_FORM_data2 DW_AT_name DW_FORM_strp DW_AT_low_pc DW_FORM_addr DW_AT_stmt_list DW_FORM_data4 DW_AT_comp_dir DW_FORM_strp [2] DW_TAG_subprogram DW_CHILDREN_yes DW_AT_name DW_FORM_strp DW_AT_decl_file DW_FORM_data1 DW_AT_decl_line DW_FORM_data1 DW_AT_prototyped DW_FORM_flag_present DW_AT_type DW_FORM_ref4 DW_AT_external DW_FORM_flag_present DW_AT_low_pc DW_FORM_addr DW_AT_high_pc DW_FORM_addr DW_AT_frame_base DW_FORM_block1 [3] DW_TAG_formal_parameter DW_CHILDREN_no DW_AT_name DW_FORM_strp DW_AT_decl_file DW_FORM_data1 DW_AT_decl_line DW_FORM_data1 DW_AT_type DW_FORM_ref4 DW_AT_location DW_FORM_block1 [4] DW_TAG_variable DW_CHILDREN_no DW_AT_name DW_FORM_strp DW_AT_decl_file DW_FORM_data1 DW_AT_decl_line DW_FORM_data1 DW_AT_type DW_FORM_ref4 DW_AT_location DW_FORM_block1 [5] DW_TAG_base_type DW_CHILDREN_no DW_AT_name DW_FORM_strp DW_AT_encoding DW_FORM_data1 DW_AT_byte_size DW_FORM_data1 [6] DW_TAG_pointer_type DW_CHILDREN_no DW_AT_type DW_FORM_ref4 .debug_info contents: 0x00000000: Compile Unit: length = 0x00000094 version = 0x0002 abbr_offset = 0x0000 addr_size = 0x04 (next CU at 0x00000098) 0x0000000b: DW_TAG_compile_unit [1] * 0x0000000c: DW_AT_producer [DW_FORM_strp] ( .debug_str[0x00000000] "clang version 3.3 (/opt/git.repo/clang.git/ b422d20530588813b09057b45d5b383f0b175ced) (/opt/git.repo/llvm.git/ 57b428f0a6be7b81bc364b0088992b1f820b516e)") 0x00000010: DW_AT_language [DW_FORM_data2] (0x000c) 0x00000012: DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000099] = "test.c") 0x00000016: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) 0x0000001a: DW_AT_stmt_list [DW_FORM_data4] (0x00000000) 0x0000001e: DW_AT_comp_dir [DW_FORM_strp] ( .debug_str[0x000000a0] "/home/yangyy/workspace/newlib") 0x00000022: DW_TAG_subprogram [2] * 0x00000023: DW_AT_name [DW_FORM_strp] ( .debug_str[0x000000be] = "main") 0x00000027: DW_AT_decl_file [DW_FORM_data1] (0x01) 0x00000028: DW_AT_decl_line [DW_FORM_data1] (0x02) 0x00000029: DW_AT_prototyped [DW_FORM_flag_present] (true) 0x00000029: DW_AT_type [DW_FORM_ref4] (cu + 0x007f => {0x0000007f}) 0x0000002d: DW_AT_external [DW_FORM_flag_present] (true) 0x0000002d: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000028) 0x00000031: DW_AT_high_pc [DW_FORM_addr] (0x0000000000000084) 0x00000035: DW_AT_frame_base [DW_FORM_block1] (<0x02> 90 3c ) 0x00000038: DW_TAG_formal_parameter [3] 0x00000039: DW_AT_name [DW_FORM_strp] ( .debug_str[0x000000c7] "argc") 0x0000003d: DW_AT_decl_file [DW_FORM_data1] (0x01) 0x0000003e: DW_AT_decl_line [DW_FORM_data1] (0x02) 0x0000003f: DW_AT_type [DW_FORM_ref4] (cu + 0x007f => {0x0000007f}) 0x00000043: DW_AT_location [DW_FORM_block1] (<0x02> 91 18 ) 0x00000046: DW_TAG_formal_parameter [3] 0x00000047: DW_AT_name [DW_FORM_strp] ( .debug_str[0x000000cc] "argv") 0x0000004b: DW_AT_decl_file [DW_FORM_data1] (0x01) 0x0000004c: DW_AT_decl_line [DW_FORM_data1] (0x02) 0x0000004d: DW_AT_type [DW_FORM_ref4] (cu + 0x0092 => {0x00000092}) 0x00000051: DW_AT_location [DW_FORM_block1] (<0x02> 91 14 ) 0x00000054: DW_TAG_variable [4] 0x00000055: DW_AT_name [DW_FORM_strp] ( .debug_str[0x000000d6] = "a") 0x00000059: DW_AT_decl_file [DW_FORM_data1] (0x01) 0x0000005a: DW_AT_decl_line [DW_FORM_data1] (0x04) 0x0000005b: DW_AT_type [DW_FORM_ref4] (cu + 0x007f => {0x0000007f}) 0x0000005f: DW_AT_location [DW_FORM_block1] (<0x02> 91 10 ) 0x00000062: DW_TAG_variable [4] 0x00000063: DW_AT_name [DW_FORM_strp] ( .debug_str[0x000000d8] = "b") 0x00000067: DW_AT_decl_file [DW_FORM_data1] (0x01) 0x00000068: DW_AT_decl_line [DW_FORM_data1] (0x05) 0x00000069: DW_AT_type [DW_FORM_ref4] (cu + 0x007f => {0x0000007f}) 0x0000006d: DW_AT_location [DW_FORM_block1] (<0x02> 91 0c ) 0x00000070: DW_TAG_variable [4] 0x00000071: DW_AT_name [DW_FORM_strp] ( .debug_str[0x000000da] = "c") 0x00000075: DW_AT_decl_file [DW_FORM_data1] (0x01) 0x00000076: DW_AT_decl_line [DW_FORM_data1] (0x06) 0x00000077: DW_AT_type [DW_FORM_ref4] (cu + 0x007f => {0x0000007f}) 0x0000007b: DW_AT_location [DW_FORM_block1] (<0x02> 91 08 ) 0x0000007e: NULL 0x0000007f: DW_TAG_base_type [5] 0x00000080: DW_AT_name [DW_FORM_strp] ( .debug_str[0x000000c3] = "int") 0x00000084: DW_AT_encoding [DW_FORM_data1] (0x05) 0x00000085: DW_AT_byte_size [DW_FORM_data1] (0x04) 0x00000086: DW_TAG_base_type [5] 0x00000087: DW_AT_name [DW_FORM_strp] ( .debug_str[0x000000d1] = "char") 0x0000008b: DW_AT_encoding [DW_FORM_data1] (0x06) 0x0000008c: DW_AT_byte_size [DW_FORM_data1] (0x01) 0x0000008d: DW_TAG_pointer_type [6] 0x0000008e: DW_AT_type [DW_FORM_ref4] (cu + 0x0086 => {0x00000086}) 0x00000092: DW_TAG_pointer_type [6] 0x00000093: DW_AT_type [DW_FORM_ref4] (cu + 0x008d => {0x0000008d}) 0x00000097: NULL .debug_frame contents: .debug_aranges contents: .debug_line contents: Line table prologue: total_length: 0x00000037 version: 2 prologue_length: 0x0000001d min_inst_length: 1 default_is_stmt: 1 line_base: -5 line_range: 14 opcode_base: 13 standard_opcode_lengths[DW_LNS_copy] = 0 standard_opcode_lengths[DW_LNS_advance_pc] = 1 standard_opcode_lengths[DW_LNS_advance_line] = 1 standard_opcode_lengths[DW_LNS_set_file] = 1 standard_opcode_lengths[DW_LNS_set_column] = 1 standard_opcode_lengths[DW_LNS_negate_stmt] = 0 standard_opcode_lengths[DW_LNS_set_basic_block] = 0 standard_opcode_lengths[DW_LNS_const_add_pc] = 0 standard_opcode_lengths[DW_LNS_fixed_advance_pc] = 1 standard_opcode_lengths[DW_LNS_set_prologue_end] = 0 standard_opcode_lengths[DW_LNS_set_epilogue_begin] = 0 standard_opcode_lengths[DW_LNS_set_isa] = 1 Dir Mod Time File Len File Name ---- ---------- ---------- --------------------------- file_names[ 1] 0 0x00000000 0x00000000 test.c Address Line Column File ISA Flags ------------------ ------ ------ ------ --- ------------- 0x0000000000000028 2 0 1 0 is_stmt prologue_end 0x0000000000000050 4 0 1 0 is_stmt 0x0000000000000058 5 0 1 0 is_stmt 0x000000000000005c 6 0 1 0 is_stmt 0x0000000000000068 7 0 1 0 is_stmt 0x0000000000000084 7 0 1 0 is_stmt end_sequence .debug_str contents: 0x00000000: "clang version 3.3 (/opt/git.repo/clang.git/ b422d20530588813b09057b45d5b383f0b175ced) (/opt/git.repo/llvm.git/ 57b428f0a6be7b81bc364b0088992b1f820b516e)" 0x00000099: "test.c" 0x000000a0: "/home/yangyy/workspace/newlib" 0x000000be: "main" 0x000000c3: "int" 0x000000c7: "argc" 0x000000cc: "argv" 0x000000d1: "char" 0x000000d6: "a" 0x000000d8: "b" 0x000000da: "c" .debug_ranges contents: .debug_pubnames contents: Length: 0 Version: 0 Offset in .debug_info: 0 Size: 0 Offset Name .debug_abbrev.dwo contents: < EMPTY > 2014-02-19 2:28 GMT+08:00 Greg Clayton <gclayton at apple.com>:> All of this information is contained in the DWARF debug info that you must > generate. Are you generating DWARF? If not, you will need to. If so, please > attach an example program that contains DWARF and specify which function > you are having trouble getting variable information for. > > Greg Clayton > > On Feb 18, 2014, at 12:44 AM, 杨勇勇 <triple.yang at gmail.com> wrote: > > > Hi, all > > > > I ported llvm backend and lldb recently. Both tools can basically work. > > lldb is able to debug programs in asm style and frame unwinding is OK. > > > > But "frame variable XX" does not work because lldb is not able to > determine the address of > > XX from debug info. > > > > Can someone give any clue? > > Thanks in advance. > > > > -- > > 杨勇勇 (Yang Yong-Yong) > > _______________________________________________ > > lldb-dev mailing list > > lldb-dev at cs.uiuc.edu > > http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev > >-- 杨勇勇 (Yang Yong-Yong) -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140219/07f9e390/attachment.html>
Yuri
2014-Feb-20 21:58 UTC
[LLVMdev] How is variable info retrieved in debugging for executables generated by llvm backend?
On 02/18/2014 00:44, 杨勇勇 wrote:> I ported llvm backend and lldb recently. Both tools can basically work. > lldb is able to debug programs in asm style and frame unwinding is OK. > > But "frame variable XX" does not work because lldb is not able to determine > the address of > XX from debug info.I recently did some work with the debug info as generated by llvm, and there are a lot of bugs. LLVM writes wrong DWARF info. My impression is that DWARF writer is barely passable with clang-generated code, or maybe it malfunctions with clang as well. People don't hold debug info to the same high standard as the code itself. Here is an example when variable info generated is plain wrong: http://llvm.org/bugs/show_bug.cgi?id=18866 Yuri
David Blaikie
2014-Feb-20 22:07 UTC
[LLVMdev] How is variable info retrieved in debugging for executables generated by llvm backend?
On Thu, Feb 20, 2014 at 1:58 PM, Yuri <yuri at rawbw.com> wrote:> On 02/18/2014 00:44, 杨勇勇 wrote: > >> I ported llvm backend and lldb recently. Both tools can basically work. >> lldb is able to debug programs in asm style and frame unwinding is OK. >> >> But "frame variable XX" does not work because lldb is not able to >> determine >> the address of >> XX from debug info. >> > > I recently did some work with the debug info as generated by llvm, and > there are a lot of bugs. LLVM writes wrong DWARF info. My impression is > that DWARF writer is barely passable with clang-generated code, or maybe it > malfunctions with clang as well. People don't hold debug info to the same > high standard as the code itself. > > Here is an example when variable info generated is plain wrong: > http://llvm.org/bugs/show_bug.cgi?id=18866Certainly there are bugs, but practically speaking I wouldn't characterize clang-generated debug info to be "barely passable". It generally works for me - it passes much of the GDB 7.5 test suite successfully. (this is all predicated on: "at -O0" - optimized debug info is another story entirely. Though there are even issues with locations (and sometimes even types!) at -O0, but they're pretty rare in my experience - I use Clang to debug Clang day-to-day and only every few months do I hit a bug)> > > Yuri > > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140220/3c341512/attachment.html>