diff options
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/Bitcode/Reader/BitcodeReader.cpp | 19 | ||||
-rw-r--r-- | llvm/lib/Bitcode/Writer/BitcodeWriter.cpp | 4 | ||||
-rw-r--r-- | llvm/lib/IR/AsmWriter.cpp | 7 | ||||
-rw-r--r-- | llvm/test/Assembler/metadata-null-operands.ll | 13 |
4 files changed, 27 insertions, 16 deletions
diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index 649057dddf0..bb6ba6fc6e1 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -1407,8 +1407,8 @@ std::error_code BitcodeReader::ParseMetadata() { GET_OR_DISTINCT(MDDerivedType, Record[0], (Context, Record[1], getMDString(Record[2]), getMDOrNull(Record[3]), Record[4], - getMDOrNull(Record[5]), getMD(Record[6]), Record[7], - Record[8], Record[9], Record[10], + getMDOrNull(Record[5]), getMDOrNull(Record[6]), + Record[7], Record[8], Record[9], Record[10], getMDOrNull(Record[11]))), NextMDValueNo++); break; @@ -1454,13 +1454,14 @@ std::error_code BitcodeReader::ParseMetadata() { return Error("Invalid record"); MDValueList.AssignValue( - GET_OR_DISTINCT( - MDCompileUnit, Record[0], - (Context, Record[1], getMD(Record[2]), getMDString(Record[3]), - Record[4], getMDString(Record[5]), Record[6], - getMDString(Record[7]), Record[8], getMDOrNull(Record[9]), - getMDOrNull(Record[10]), getMDOrNull(Record[11]), - getMDOrNull(Record[12]), getMDOrNull(Record[13]))), + GET_OR_DISTINCT(MDCompileUnit, Record[0], + (Context, Record[1], getMDOrNull(Record[2]), + getMDString(Record[3]), Record[4], + getMDString(Record[5]), Record[6], + getMDString(Record[7]), Record[8], + getMDOrNull(Record[9]), getMDOrNull(Record[10]), + getMDOrNull(Record[11]), getMDOrNull(Record[12]), + getMDOrNull(Record[13]))), NextMDValueNo++); break; } diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp index 932381926c7..ec43035b22e 100644 --- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -864,7 +864,7 @@ static void WriteMDDerivedType(const MDDerivedType *N, Record.push_back(VE.getMetadataOrNullID(N->getFile())); Record.push_back(N->getLine()); Record.push_back(VE.getMetadataOrNullID(N->getScope())); - Record.push_back(VE.getMetadataID(N->getBaseType())); + Record.push_back(VE.getMetadataOrNullID(N->getBaseType())); Record.push_back(N->getSizeInBits()); Record.push_back(N->getAlignInBits()); Record.push_back(N->getOffsetInBits()); @@ -932,7 +932,7 @@ static void WriteMDCompileUnit(const MDCompileUnit *N, unsigned Abbrev) { Record.push_back(N->isDistinct()); Record.push_back(N->getSourceLanguage()); - Record.push_back(VE.getMetadataID(N->getFile())); + Record.push_back(VE.getMetadataOrNullID(N->getFile())); Record.push_back(VE.getMetadataOrNullID(N->getRawProducer())); Record.push_back(N->isOptimized()); Record.push_back(VE.getMetadataOrNullID(N->getRawFlags())); diff --git a/llvm/lib/IR/AsmWriter.cpp b/llvm/lib/IR/AsmWriter.cpp index ac86acd1741..47a1b5512a9 100644 --- a/llvm/lib/IR/AsmWriter.cpp +++ b/llvm/lib/IR/AsmWriter.cpp @@ -1515,11 +1515,8 @@ static void writeMDCompileUnit(raw_ostream &Out, const MDCompileUnit *N, Out << Lang; else Out << N->getSourceLanguage(); - if (N->getFile()) { - Out << FS << "file: "; - writeMetadataAsOperand(Out, N->getFile(), TypePrinter, Machine, - Context); - } + Out << FS << "file: "; + writeMetadataAsOperand(Out, N->getFile(), TypePrinter, Machine, Context); if (!N->getProducer().empty()) Out << FS << "producer: \"" << N->getProducer() << "\""; Out << FS << "isOptimized: " << (N->isOptimized() ? "true" : "false"); diff --git a/llvm/test/Assembler/metadata-null-operands.ll b/llvm/test/Assembler/metadata-null-operands.ll new file mode 100644 index 00000000000..acae1d4be99 --- /dev/null +++ b/llvm/test/Assembler/metadata-null-operands.ll @@ -0,0 +1,13 @@ +; RUN: llvm-as < %s | llvm-dis | llvm-as | llvm-dis | FileCheck %s +; RUN: verify-uselistorder %s + +; Don't crash on null operands. (If/when we add a verify check for these, we +; should disable the verifier for this test and remove this comment; the test +; is still important.) +!named = !{!0, !1} +!0 = !MDDerivedType(tag: DW_TAG_pointer_type, baseType: null) +!1 = !MDCompileUnit(language: DW_LANG_C, file: null) + +; CHECK: !named = !{!0, !1} +; CHECK: !0 = !MDDerivedType({{.*}}baseType: null{{.*}}) +; CHECK: !1 = !MDCompileUnit({{.*}}file: null{{.*}}) |