1266877a2SJordan Rupprecht;; Verify that llvm-objdump -l also prints the function name in disassembly 2266877a2SJordan Rupprecht;; output, getting it from the debug info. 3266877a2SJordan Rupprecht 4266877a2SJordan Rupprecht; RUN: llc < %s -o %t.o -filetype=obj -mtriple=x86_64-unknown-linux-gnu 5*75cdab6dSDaniel Thornburgh; RUN: llvm-objdump --no-print-imm-hex -dl %t.o | FileCheck %s --check-prefixes=CHECK,CHECK-NO-DEMANGLE 6266877a2SJordan Rupprecht 7266877a2SJordan Rupprecht; RUN: llc < %s -o %t.o -filetype=obj -mtriple=x86_64-unknown-linux-gnu 8*75cdab6dSDaniel Thornburgh; RUN: llvm-objdump --no-print-imm-hex -dlC %t.o | FileCheck %s --check-prefixes=CHECK,CHECK-DEMANGLE 9266877a2SJordan Rupprecht 1071e2ca6eSFangrui Song; CHECK: 0000000000000000 <foo>: 11266877a2SJordan Rupprecht; CHECK-NEXT: ; foo(): 12d17123b2SFangrui Song; CHECK-NEXT: ; /tmp{{/|\\}}src.cc:1 13266877a2SJordan Rupprecht; CHECK-NEXT: 0: b8 05 00 00 00 movl $5, %eax 14266877a2SJordan Rupprecht; CHECK-NEXT: 5: c3 retq 15266877a2SJordan Rupprecht 1671e2ca6eSFangrui Song; CHECK-NO-DEMANGLE: 0000000000000010 <_ZN3xyz3barEv>: 17266877a2SJordan Rupprecht; CHECK-NO-DEMANGLE-NEXT: ; _ZN3xyz3barEv(): 1871e2ca6eSFangrui Song; CHECK-DEMANGLE: 0000000000000010 <xyz::bar()>: 19266877a2SJordan Rupprecht; CHECK-DEMANGLE-NEXT: ; xyz::bar(): 20266877a2SJordan Rupprecht 21d17123b2SFangrui Song; CHECK-NEXT: ; /tmp{{/|\\}}src.cc:3 22266877a2SJordan Rupprecht; CHECK-NEXT: 10: b8 0a 00 00 00 movl $10, %eax 23266877a2SJordan Rupprecht; CHECK-NEXT: 15: c3 retq 24266877a2SJordan Rupprecht 2571e2ca6eSFangrui Song; CHECK-NO-DEMANGLE: 0000000000000020 <_ZN3xyz3bazEv>: 26266877a2SJordan Rupprecht; CHECK-NO-DEMANGLE-NEXT: ; _ZN3xyz3bazEv(): 2771e2ca6eSFangrui Song; CHECK-DEMANGLE: 0000000000000020 <xyz::baz()>: 28266877a2SJordan Rupprecht; CHECK-DEMANGLE-NEXT: ; xyz::baz(): 29266877a2SJordan Rupprecht 30d17123b2SFangrui Song; CHECK-NEXT: ; /tmp{{/|\\}}src.cc:3 31266877a2SJordan Rupprecht; CHECK-NEXT: 20: b8 14 00 00 00 movl $20, %eax 32266877a2SJordan Rupprecht; CHECK-NEXT: 25: c3 retq 33266877a2SJordan Rupprecht 34266877a2SJordan Rupprecht;; When symbol information is missing, we can get function names from debug 35266877a2SJordan Rupprecht;; info. The IR is intentionally doctored to have different names in debug info 36266877a2SJordan Rupprecht;; for the test case here. 37266877a2SJordan Rupprecht; RUN: llvm-strip %t.o -N foo -N _ZN3xyz3barEv -N _ZN3xyz3bazEv -o %t-stripped.o 38*75cdab6dSDaniel Thornburgh; RUN: llvm-objdump --no-print-imm-hex -dlC %t-stripped.o | FileCheck %s --check-prefix=STRIPPED 39266877a2SJordan Rupprecht 4071e2ca6eSFangrui Song; STRIPPED: 0000000000000000 <.text>: 41266877a2SJordan Rupprecht; STRIPPED-NEXT: ; Function1(): 42d17123b2SFangrui Song; STRIPPED-NEXT: ; /tmp{{/|\\}}src.cc:1 43266877a2SJordan Rupprecht; STRIPPED-NEXT: 0: b8 05 00 00 00 movl $5, %eax 44266877a2SJordan Rupprecht; STRIPPED-NEXT: 5: c3 retq 45266877a2SJordan Rupprecht 46266877a2SJordan Rupprecht; STRIPPED: ; xyz::bar(): 47d17123b2SFangrui Song; STRIPPED-NEXT: ; /tmp{{/|\\}}src.cc:3 48266877a2SJordan Rupprecht; STRIPPED-NEXT: 10: b8 0a 00 00 00 movl $10, %eax 49266877a2SJordan Rupprecht; STRIPPED-NEXT: 15: c3 retq 50266877a2SJordan Rupprecht 51266877a2SJordan Rupprecht; STRIPPED: ; xyz::baz(): 52d17123b2SFangrui Song; STRIPPED-NEXT: ; /tmp{{/|\\}}src.cc:3 53266877a2SJordan Rupprecht; STRIPPED-NEXT: 20: b8 14 00 00 00 movl $20, %eax 54266877a2SJordan Rupprecht; STRIPPED-NEXT: 25: c3 retq 55266877a2SJordan Rupprecht 56266877a2SJordan Rupprecht;; IR adapted from: 57266877a2SJordan Rupprecht;; $ cat /tmp/src.cc 58266877a2SJordan Rupprecht;; extern "C" int foo() { return 5; }; 59266877a2SJordan Rupprecht;; namespace xyz { 60266877a2SJordan Rupprecht;; int bar() { return 10; } int baz() { return 20; } 61266877a2SJordan Rupprecht;; } // namespace xyz 62266877a2SJordan Rupprecht;; $ clang++ -O -g -c /tmp/src.cc -S -emit-llvm 63266877a2SJordan Rupprecht;; Note: bar() and baz() intentionally written on the same line. 64266877a2SJordan Rupprecht 65266877a2SJordan Rupprecht; ModuleID = '/tmp/src.cc' 66266877a2SJordan Rupprechtsource_filename = "/tmp/src.cc" 67266877a2SJordan Rupprechttarget triple = "x86_64-unknown-linux-gnu" 68266877a2SJordan Rupprecht 69266877a2SJordan Rupprechtdefine dso_local i32 @foo() #0 !dbg !7 { 70266877a2SJordan Rupprechtentry: 71266877a2SJordan Rupprecht ret i32 5, !dbg !12 72266877a2SJordan Rupprecht} 73266877a2SJordan Rupprecht 74266877a2SJordan Rupprechtdefine dso_local i32 @_ZN3xyz3barEv() #0 !dbg !13 { 75266877a2SJordan Rupprechtentry: 76266877a2SJordan Rupprecht ret i32 10, !dbg !15 77266877a2SJordan Rupprecht} 78266877a2SJordan Rupprecht 79266877a2SJordan Rupprechtdefine dso_local i32 @_ZN3xyz3bazEv() #0 !dbg !16 { 80266877a2SJordan Rupprechtentry: 81266877a2SJordan Rupprecht ret i32 20, !dbg !17 82266877a2SJordan Rupprecht} 83266877a2SJordan Rupprecht 84266877a2SJordan Rupprechtattributes #0 = { "frame-pointer"="none" } 85266877a2SJordan Rupprecht 86266877a2SJordan Rupprecht!llvm.dbg.cu = !{!0} 87266877a2SJordan Rupprecht!llvm.module.flags = !{!3, !4, !5} 88266877a2SJordan Rupprecht!llvm.ident = !{!6} 89266877a2SJordan Rupprecht 90266877a2SJordan Rupprecht!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang trunk", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, splitDebugInlining: false, nameTableKind: None) 91266877a2SJordan Rupprecht; Note: <invalid> triggers a bad DILineInfo. We still print "Function1()". 92266877a2SJordan Rupprecht!1 = !DIFile(filename: "<invalid>", directory: "") 93266877a2SJordan Rupprecht!2 = !{} 94266877a2SJordan Rupprecht!3 = !{i32 7, !"Dwarf Version", i32 4} 95266877a2SJordan Rupprecht!4 = !{i32 2, !"Debug Info Version", i32 3} 96266877a2SJordan Rupprecht!5 = !{i32 1, !"wchar_size", i32 4} 97266877a2SJordan Rupprecht!6 = !{!"clang trunk)"} 98266877a2SJordan Rupprecht!7 = distinct !DISubprogram(name: "Function1", scope: !8, file: !8, line: 1, type: !9, scopeLine: 1, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2) 99266877a2SJordan Rupprecht!8 = !DIFile(filename: "/tmp/src.cc", directory: "") 100266877a2SJordan Rupprecht!9 = !DISubroutineType(types: !10) 101266877a2SJordan Rupprecht!10 = !{!11} 102266877a2SJordan Rupprecht!11 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) 103266877a2SJordan Rupprecht!12 = !DILocation(line: 1, column: 24, scope: !7) 104266877a2SJordan Rupprecht!13 = distinct !DISubprogram(name: "bar", linkageName: "_ZN3xyz3barEv", scope: !14, file: !8, line: 3, type: !9, scopeLine: 3, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2) 105266877a2SJordan Rupprecht!14 = !DINamespace(name: "xyz", scope: null) 106266877a2SJordan Rupprecht!15 = !DILocation(line: 3, column: 13, scope: !13) 107266877a2SJordan Rupprecht!16 = distinct !DISubprogram(name: "baz", linkageName: "_ZN3xyz3bazEv", scope: !14, file: !8, line: 3, type: !9, scopeLine: 3, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2) 108266877a2SJordan Rupprecht!17 = !DILocation(line: 3, column: 38, scope: !16) 109