aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Target/DirectX/DXILWriter/DXILBitcodeWriter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target/DirectX/DXILWriter/DXILBitcodeWriter.cpp')
-rw-r--r--llvm/lib/Target/DirectX/DXILWriter/DXILBitcodeWriter.cpp55
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();