diff options
Diffstat (limited to 'llvm/lib/Target/DirectX/DXILWriter/DXILBitcodeWriter.cpp')
| -rw-r--r-- | llvm/lib/Target/DirectX/DXILWriter/DXILBitcodeWriter.cpp | 55 |
1 files changed, 48 insertions, 7 deletions
diff --git a/llvm/lib/Target/DirectX/DXILWriter/DXILBitcodeWriter.cpp b/llvm/lib/Target/DirectX/DXILWriter/DXILBitcodeWriter.cpp index 0e064d7227ce..46d5d7177c19 100644 --- a/llvm/lib/Target/DirectX/DXILWriter/DXILBitcodeWriter.cpp +++ b/llvm/lib/Target/DirectX/DXILWriter/DXILBitcodeWriter.cpp @@ -237,12 +237,21 @@ private: SmallVectorImpl<uint64_t> &Record, unsigned Abbrev); void writeDIBasicType(const DIBasicType *N, SmallVectorImpl<uint64_t> &Record, unsigned Abbrev); + void writeDIFixedPointType(const DIFixedPointType *N, + SmallVectorImpl<uint64_t> &Record, + unsigned Abbrev) { + llvm_unreachable("DXIL cannot contain DIFixedPointType Nodes"); + } void writeDIStringType(const DIStringType *N, SmallVectorImpl<uint64_t> &Record, unsigned Abbrev) { llvm_unreachable("DXIL cannot contain DIStringType Nodes"); } void writeDIDerivedType(const DIDerivedType *N, SmallVectorImpl<uint64_t> &Record, unsigned Abbrev); + void writeDISubrangeType(const DISubrangeType *N, + SmallVectorImpl<uint64_t> &Record, unsigned Abbrev) { + llvm_unreachable("DXIL cannot contain DISubrangeType Nodes"); + } void writeDICompositeType(const DICompositeType *N, SmallVectorImpl<uint64_t> &Record, unsigned Abbrev); void writeDISubroutineType(const DISubroutineType *N, @@ -644,8 +653,6 @@ uint64_t DXILBitcodeWriter::getAttrKindEncoding(Attribute::AttrKind Kind) { return bitc::ATTR_KIND_NO_ALIAS; case Attribute::NoBuiltin: return bitc::ATTR_KIND_NO_BUILTIN; - case Attribute::NoCapture: - return bitc::ATTR_KIND_NO_CAPTURE; case Attribute::NoDuplicate: return bitc::ATTR_KIND_NO_DUPLICATE; case Attribute::NoImplicitFloat: @@ -1159,8 +1166,8 @@ void DXILBitcodeWriter::writeValueSymbolTableForwardDecl() {} void DXILBitcodeWriter::writeModuleInfo() { // Emit various pieces of data attached to a module. if (!M.getTargetTriple().empty()) - writeStringRecord(Stream, bitc::MODULE_CODE_TRIPLE, M.getTargetTriple(), - 0 /*TODO*/); + writeStringRecord(Stream, bitc::MODULE_CODE_TRIPLE, + M.getTargetTriple().str(), 0 /*TODO*/); const std::string &DL = M.getDataLayoutStr(); if (!DL.empty()) writeStringRecord(Stream, bitc::MODULE_CODE_DATALAYOUT, DL, 0 /*TODO*/); @@ -1967,12 +1974,12 @@ void DXILBitcodeWriter::writeConstants(unsigned FirstVal, unsigned LastVal, unsigned(IA->getDialect() & 1) << 2); // Add the asm string. - const std::string &AsmStr = IA->getAsmString(); + StringRef AsmStr = IA->getAsmString(); Record.push_back(AsmStr.size()); Record.append(AsmStr.begin(), AsmStr.end()); // Add the constraint string. - const std::string &ConstraintStr = IA->getConstraintString(); + StringRef ConstraintStr = IA->getConstraintString(); Record.push_back(ConstraintStr.size()); Record.append(ConstraintStr.begin(), ConstraintStr.end()); Stream.EmitRecord(bitc::CST_CODE_INLINEASM, Record); @@ -2538,6 +2545,25 @@ void DXILBitcodeWriter::writeInstruction(const Instruction &I, unsigned InstID, Vals.clear(); } +// HLSL Change +namespace { +struct ValueNameCreator { + MallocAllocator Allocator; + SmallVector<ValueName *, 2> + ValueNames; // SmallVector N = 2 because we currently only expect this + // to hold ValueNames for Lifetime intrinsics + ~ValueNameCreator() { + for (auto *VN : ValueNames) + VN->Destroy(Allocator); + } + ValueName *create(StringRef Name, Value *V) { + ValueName *VN = ValueName::create(Name, Allocator, V); + ValueNames.push_back(VN); + return VN; + } +}; +} // anonymous namespace + // Emit names for globals/functions etc. void DXILBitcodeWriter::writeFunctionLevelValueSymbolTable( const ValueSymbolTable &VST) { @@ -2552,9 +2578,24 @@ void DXILBitcodeWriter::writeFunctionLevelValueSymbolTable( // to ensure the binary is the same no matter what values ever existed. SmallVector<const ValueName *, 16> SortedTable; + // HLSL Change + ValueNameCreator VNC; for (auto &VI : VST) { - SortedTable.push_back(VI.second->getValueName()); + ValueName *VN = VI.second->getValueName(); + // Clang mangles lifetime intrinsic names by appending '.p0' to the end, + // making them invalid lifetime intrinsics in LLVM 3.7. We can't + // demangle in dxil-prepare because it would result in invalid IR. + // Therefore we have to do this in the bitcode writer while writing its + // name to the symbol table. + if (const Function *Fn = dyn_cast<Function>(VI.getValue()); + Fn && Fn->isIntrinsic()) { + Intrinsic::ID IID = Fn->getIntrinsicID(); + if (IID == Intrinsic::lifetime_start || IID == Intrinsic::lifetime_end) + VN = VNC.create(Intrinsic::getBaseName(IID), VI.second); + } + SortedTable.push_back(VN); } + // The keys are unique, so there shouldn't be stability issues. llvm::sort(SortedTable, [](const ValueName *A, const ValueName *B) { return A->first() < B->first(); |
