From 1c092c03ba519a4e375523fa49f708da99745af4 Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Fri, 13 Feb 2015 01:22:59 +0000 Subject: [PATCH] AsmWriter/Bitcode: MDSubroutineType git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@229011 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Bitcode/LLVMBitCodes.h | 3 ++- lib/AsmParser/LLParser.cpp | 9 ++++++++- lib/Bitcode/Reader/BitcodeReader.cpp | 10 ++++++++++ lib/Bitcode/Writer/BitcodeWriter.cpp | 15 +++++++++++---- lib/IR/AsmWriter.cpp | 14 ++++++++++---- test/Assembler/debug-info.ll | 12 ++++++++++-- .../invalid-mdsubroutinetype-missing-types.ll | 4 ++++ 7 files changed, 55 insertions(+), 12 deletions(-) create mode 100644 test/Assembler/invalid-mdsubroutinetype-missing-types.ll diff --git a/include/llvm/Bitcode/LLVMBitCodes.h b/include/llvm/Bitcode/LLVMBitCodes.h index c221ad2dc90..84991585c67 100644 --- a/include/llvm/Bitcode/LLVMBitCodes.h +++ b/include/llvm/Bitcode/LLVMBitCodes.h @@ -153,7 +153,8 @@ namespace bitc { METADATA_BASIC_TYPE = 15, // [distinct, tag, name, size, align, enc] METADATA_FILE = 16, // [distinct, filename, directory] METADATA_DERIVED_TYPE = 17, // [distinct, ...] - METADATA_COMPOSITE_TYPE= 18 // [distinct, ...] + METADATA_COMPOSITE_TYPE= 18, // [distinct, ...] + METADATA_SUBROUTINE_TYPE= 19 // [distinct, flags, types] }; // The constants block (CONSTANTS_BLOCK_ID) describes emission for each diff --git a/lib/AsmParser/LLParser.cpp b/lib/AsmParser/LLParser.cpp index 33f395a1f5a..24442ef127b 100644 --- a/lib/AsmParser/LLParser.cpp +++ b/lib/AsmParser/LLParser.cpp @@ -3329,7 +3329,14 @@ bool LLParser::ParseMDCompositeType(MDNode *&Result, bool IsDistinct) { } bool LLParser::ParseMDSubroutineType(MDNode *&Result, bool IsDistinct) { - return TokError("unimplemented parser"); +#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \ + OPTIONAL(flags, MDUnsignedField, (0, UINT32_MAX)); \ + REQUIRED(types, MDField, ); + PARSE_MD_FIELDS(); +#undef VISIT_MD_FIELDS + + Result = GET_OR_DISTINCT(MDSubroutineType, (Context, flags.Val, types.Val)); + return false; } /// ParseMDFileType: diff --git a/lib/Bitcode/Reader/BitcodeReader.cpp b/lib/Bitcode/Reader/BitcodeReader.cpp index 6c38e0d85b4..5fc758a93cc 100644 --- a/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/lib/Bitcode/Reader/BitcodeReader.cpp @@ -1417,6 +1417,16 @@ std::error_code BitcodeReader::ParseMetadata() { NextMDValueNo++); break; } + case bitc::METADATA_SUBROUTINE_TYPE: { + if (Record.size() != 3) + return Error("Invalid record"); + + MDValueList.AssignValue( + GET_OR_DISTINCT(MDSubroutineType, Record[0], + (Context, Record[1], getMDOrNull(Record[2]))), + NextMDValueNo++); + break; + } case bitc::METADATA_FILE: { if (Record.size() != 3) return Error("Invalid record"); diff --git a/lib/Bitcode/Writer/BitcodeWriter.cpp b/lib/Bitcode/Writer/BitcodeWriter.cpp index 0c1b1e127b9..6f275ab7962 100644 --- a/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -901,10 +901,17 @@ static void WriteMDCompositeType(const MDCompositeType *N, Record.clear(); } -static void WriteMDSubroutineType(const MDSubroutineType *, - const ValueEnumerator &, BitstreamWriter &, - SmallVectorImpl &, unsigned) { - llvm_unreachable("write not implemented"); +static void WriteMDSubroutineType(const MDSubroutineType *N, + const ValueEnumerator &VE, + BitstreamWriter &Stream, + SmallVectorImpl &Record, + unsigned Abbrev) { + Record.push_back(N->isDistinct()); + Record.push_back(N->getFlags()); + Record.push_back(VE.getMetadataOrNullID(N->getTypeArray())); + + Stream.EmitRecord(bitc::METADATA_SUBROUTINE_TYPE, Record, Abbrev); + Record.clear(); } static void WriteMDFile(const MDFile *N, const ValueEnumerator &VE, diff --git a/lib/IR/AsmWriter.cpp b/lib/IR/AsmWriter.cpp index 0a585a097e2..b2205a19866 100644 --- a/lib/IR/AsmWriter.cpp +++ b/lib/IR/AsmWriter.cpp @@ -1484,10 +1484,16 @@ static void writeMDCompositeType(raw_ostream &Out, const MDCompositeType *N, Out << ")"; } -static void writeMDSubroutineType(raw_ostream &, const MDSubroutineType *, - TypePrinting *, SlotTracker *, - const Module *) { - llvm_unreachable("write not implemented"); +static void writeMDSubroutineType(raw_ostream &Out, const MDSubroutineType *N, + TypePrinting *TypePrinter, + SlotTracker *Machine, const Module *Context) { + Out << "!MDSubroutineType("; + FieldSeparator FS; + if (N->getFlags()) + Out << FS << "flags: " << N->getFlags(); + Out << FS << "types: "; + writeMetadataAsOperand(Out, N->getTypeArray(), TypePrinter, Machine, Context); + Out << ")"; } static void writeMDFile(raw_ostream &Out, const MDFile *N, TypePrinting *, diff --git a/test/Assembler/debug-info.ll b/test/Assembler/debug-info.ll index 0b8ada7a231..4d508e1bf00 100644 --- a/test/Assembler/debug-info.ll +++ b/test/Assembler/debug-info.ll @@ -1,8 +1,8 @@ ; RUN: llvm-as < %s | llvm-dis | llvm-as | llvm-dis | FileCheck %s ; RUN: verify-uselistorder %s -; CHECK: !named = !{!0, !0, !1, !2, !3, !4, !5, !6, !7, !8, !8, !9, !10, !11, !12, !13, !14, !15, !16, !17, !18, !19, !20, !21, !22, !23, !24} -!named = !{!0, !1, !2, !3, !4, !5, !6, !7, !8, !9, !10, !11, !12, !13, !14, !15, !16, !17, !18, !19, !20, !21, !22, !23, !24, !25, !26} +; CHECK: !named = !{!0, !0, !1, !2, !3, !4, !5, !6, !7, !8, !8, !9, !10, !11, !12, !13, !14, !15, !16, !17, !18, !19, !20, !21, !22, !23, !24, !25, !26, !27, !27} +!named = !{!0, !1, !2, !3, !4, !5, !6, !7, !8, !9, !10, !11, !12, !13, !14, !15, !16, !17, !18, !19, !20, !21, !22, !23, !24, !25, !26, !27, !28, !29, !30} ; CHECK: !0 = !MDSubrange(count: 3) ; CHECK-NEXT: !1 = !MDSubrange(count: 3, lowerBound: 4) @@ -62,3 +62,11 @@ !24 = !MDDerivedType(tag: DW_TAG_ptr_to_member_type, baseType: !7, size: 32, align: 32, extraData: !17) !25 = !MDCompositeType(tag: DW_TAG_structure_type) !26 = !MDCompositeType(tag: DW_TAG_structure_type, runtimeLang: 6) + +; !25 = !{!7, !7} +; !26 = !MDSubroutineType(flags: 7, types: !25) +; !27 = !MDSubroutineType(types: !25) +!27 = !{!7, !7} +!28 = !MDSubroutineType(flags: 7, types: !27) +!29 = !MDSubroutineType(flags: 0, types: !27) +!30 = !MDSubroutineType(types: !27) diff --git a/test/Assembler/invalid-mdsubroutinetype-missing-types.ll b/test/Assembler/invalid-mdsubroutinetype-missing-types.ll new file mode 100644 index 00000000000..6c976edc828 --- /dev/null +++ b/test/Assembler/invalid-mdsubroutinetype-missing-types.ll @@ -0,0 +1,4 @@ +; RUN: not llvm-as < %s -disable-output 2>&1 | FileCheck %s + +; CHECK: [[@LINE+1]]:33: error: missing required field 'types' +!29 = !MDSubroutineType(flags: 7) -- 2.34.1