From aaff953db4f72876e481e16e352c7488b5643fb4 Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Wed, 25 Feb 2015 01:10:03 +0000 Subject: [PATCH] llvm-dis: Stop crashing when dropping debug info Since r199356, we've printed a warning when dropping debug info. r225562 started crashing on that, since it registered a diagnostic handler that only expected errors. This fixes the handler to expect other severities. As a side effect, it now prints "error: " at the start of error messages, similar to `llvm-as`. There was a testcase for r199356, but it only really checked the assembler. Move `test/Bitcode/drop-debug-info.ll` to `test/Assembler`, and introduce `test/Bitcode/drop-debug-info.3.5.ll` (and companion `.bc`) to test the bitcode reader. Note: tools/gold/gold-plugin.cpp has an equivalent bug, but I'm not sure what the best fix is there. I'll file a PR. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@230416 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../{Bitcode => Assembler}/drop-debug-info.ll | 0 test/Bitcode/drop-debug-info.3.5.ll | 40 ++++++++++++++++++ test/Bitcode/drop-debug-info.3.5.ll.bc | Bin 0 -> 1264 bytes test/Bitcode/invalid.ll | 2 +- test/Bitcode/pr18704.ll | 2 +- tools/llvm-dis/llvm-dis.cpp | 13 ++++-- 6 files changed, 52 insertions(+), 5 deletions(-) rename test/{Bitcode => Assembler}/drop-debug-info.ll (100%) create mode 100644 test/Bitcode/drop-debug-info.3.5.ll create mode 100644 test/Bitcode/drop-debug-info.3.5.ll.bc diff --git a/test/Bitcode/drop-debug-info.ll b/test/Assembler/drop-debug-info.ll similarity index 100% rename from test/Bitcode/drop-debug-info.ll rename to test/Assembler/drop-debug-info.ll diff --git a/test/Bitcode/drop-debug-info.3.5.ll b/test/Bitcode/drop-debug-info.3.5.ll new file mode 100644 index 00000000000..fde136d1c3c --- /dev/null +++ b/test/Bitcode/drop-debug-info.3.5.ll @@ -0,0 +1,40 @@ +; RUN: llvm-dis < %s.bc -o %t.ll 2>&1 | FileCheck -check-prefix=WARN %s +; RUN: FileCheck -input-file=%t.ll %s + +; The bitcode paired with this test was generated by passing this file to +; llvm-dis-3.5. This tests that llvm-dis warns correctly when reading old +; bitcode. + +; CHECK-NOT: !llvm.dbg.cu +; CHECK-NOT: !dbg +; WARN: warning: ignoring debug info with an invalid version (1) +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.10.0" + +; Function Attrs: nounwind ssp uwtable +define i32 @main() #0 { +entry: + %retval = alloca i32, align 4 + store i32 0, i32* %retval + ret i32 0, !dbg !12 +} + +attributes #0 = { nounwind ssp uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!9, !10} +!llvm.ident = !{!11} + +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.5.2 (230356)", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/Users/dexonsmith/data/llvm/staging/test/Bitcode/t.c] [DW_LANG_C99] +!1 = metadata !{metadata !"t.c", metadata !"/Users/dexonsmith/data/llvm/staging/test/Bitcode"} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"main", metadata !"main", metadata !"", i32 1, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 ()* @main, null, null, metadata !2, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [main] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/Users/dexonsmith/data/llvm/staging/test/Bitcode/t.c] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{metadata !8} +!8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!9 = metadata !{i32 2, metadata !"Dwarf Version", i32 2} +!10 = metadata !{i32 2, metadata !"Debug Info Version", i32 1} +!11 = metadata !{metadata !"clang version 3.5.2 (230356)"} +!12 = metadata !{i32 1, i32 14, metadata !4, null} diff --git a/test/Bitcode/drop-debug-info.3.5.ll.bc b/test/Bitcode/drop-debug-info.3.5.ll.bc new file mode 100644 index 0000000000000000000000000000000000000000..c40198999b274adcaaed7223b43d4690666dd84b GIT binary patch literal 1264 zcmZux&1)M+6ra(qG#gvHUE9K0$Gh8I+bs&oVQU*l{!m#KR`cTkOfnqm>oIJtRlQP?hRiJt!QgPcE@a@F54l z2Y4QSF#7Uu++YsS6p<2YVX>$Pc8lwh-b3UOp3L6@wC97$ik^b z;|EQPKC$>xkq0H=%%YErLOm>EsdJ0QMxR3gL@5-@n-M^5#?2|+)O9m~tsCalnyDAi z2B^#Y3C0Pfc2X>b`JcPs&#<8||GXt!Saih_>qWj}R}+ut->gBKFb>dW-qe*2{{K_; z0xPuWc1x%yJ77*)LMbV}Mgo>_>^dFzc;F!D_X55H!toTq`UitAw5N*xPfBcu3MbBnMV(I37?+! z8N@9kO@AC>?l+jNOXhx#iK%EyLmLfO+dw!1>k^7LTz?p7i$$>lic0_9e$S$afr8f{ zFuKNo)QhS03aglBhx(Rt*(-0q|AY*t`iy>Ws^3Z8$o}FYZ+xO2uHf}uJW1E!0sOAd za5z8$`+Nt>2Ym+D@nm(VN8++Y?opA;S|B4=BzHNL6q_19Xcvc{mFD)-bM^9YE;xN& zo_$=N`yn{fAZCu>bcXO}%EO1m>`8F;s5sXM`o0d%JT6ZkLH~Yvu2CM|4a_vkz9V9K zzwCH`nZh?)ylr=g)0Ty^qF`%Gv%oY}#s>6-#++-+3!6FCph9vZ?kYP8vNE?fKeUfg zh2_B%bVyzxNrTX9I5@Y;1;CH&O$n0=b8ROM9Hdk6sM_T1JCkY%5CrKA0jILSeIM7mV4CVXcp8`UHxkZb|qZ`+aERG@vmwkWP&pIN{heef&Sf~FH_D243vnYXnx(@25&1 | FileCheck %s -; CHECK: llvm-dis{{(\.EXE|\.exe)?}}: Unknown attribute kind (48) +; CHECK: llvm-dis{{(\.EXE|\.exe)?}}: error: Unknown attribute kind (48) ; invalid.ll.bc has an invalid attribute number. ; The test checks that LLVM reports the error and doesn't access freed memory diff --git a/test/Bitcode/pr18704.ll b/test/Bitcode/pr18704.ll index f05fe53259f..e57ce3cec4c 100644 --- a/test/Bitcode/pr18704.ll +++ b/test/Bitcode/pr18704.ll @@ -1,6 +1,6 @@ ; RUN: not llvm-dis < %s.bc 2>&1 | FileCheck %s -; CHECK: llvm-dis{{(\.EXE|\.exe)?}}: Never resolved value found in function +; CHECK: llvm-dis{{(\.EXE|\.exe)?}}: error: Never resolved value found in function ; pr18704.ll.bc has an instruction referring to invalid type. ; The test checks that LLVM reports the error and doesn't access freed memory diff --git a/tools/llvm-dis/llvm-dis.cpp b/tools/llvm-dis/llvm-dis.cpp index 1349ecc85a4..1c3a9ced0ff 100644 --- a/tools/llvm-dis/llvm-dis.cpp +++ b/tools/llvm-dis/llvm-dis.cpp @@ -115,14 +115,21 @@ public: } // end anon namespace static void diagnosticHandler(const DiagnosticInfo &DI, void *Context) { - assert(DI.getSeverity() == DS_Error && "Only expecting errors"); - raw_ostream &OS = errs(); OS << (char *)Context << ": "; + switch (DI.getSeverity()) { + case DS_Error: OS << "error: "; break; + case DS_Warning: OS << "warning: "; break; + case DS_Remark: OS << "remark: "; break; + case DS_Note: OS << "note: "; break; + } + DiagnosticPrinterRawOStream DP(OS); DI.print(DP); OS << '\n'; - exit(1); + + if (DI.getSeverity() == DS_Error) + exit(1); } int main(int argc, char **argv) { -- 2.34.1