diff options
author | Arthur Eubanks <aeubanks@google.com> | 2020-02-14 14:16:53 -0800 |
---|---|---|
committer | Arthur Eubanks <aeubanks@google.com> | 2020-04-27 16:15:50 -0700 |
commit | 3b0450acecb6b753a0c60f2882a8615a4a9b4668 (patch) | |
tree | 323267a80ecfd22a71886ec9ede6cbe53c01a08f /llvm/lib/Bitcode/Reader/BitcodeReader.cpp | |
parent | 9ea5cc8a254ff29edcfa396f238bda80df0d1c9b (diff) | |
download | llvm-3b0450acecb6b753a0c60f2882a8615a4a9b4668.zip llvm-3b0450acecb6b753a0c60f2882a8615a4a9b4668.tar.gz llvm-3b0450acecb6b753a0c60f2882a8615a4a9b4668.tar.bz2 |
Add IR constructs for preallocated (inalloca replacement)
Add llvm.call.preallocated.{setup,arg} instrinsics.
Add "preallocated" operand bundle which takes a token produced by llvm.call.preallocated.setup.
Add "preallocated" parameter attribute, which is like byval but without the copy.
Verifier changes for these IR constructs.
See https://github.com/rnk/llvm-project/blob/call-setup-docs/llvm/docs/CallSetup.md
Subscribers: hiraditya, jdoerfert, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D74651
Diffstat (limited to 'llvm/lib/Bitcode/Reader/BitcodeReader.cpp')
-rw-r--r-- | llvm/lib/Bitcode/Reader/BitcodeReader.cpp | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index 4b8b0ec..9bdac5c4 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -1303,6 +1303,9 @@ static uint64_t getRawAttributeMask(Attribute::AttrKind Val) { case Attribute::SanitizeMemTag: llvm_unreachable("sanitize_memtag attribute not supported in raw format"); break; + case Attribute::Preallocated: + llvm_unreachable("preallocated attribute not supported in raw format"); + break; } llvm_unreachable("Unsupported attribute type"); } @@ -1312,12 +1315,10 @@ static void addRawAttributeValue(AttrBuilder &B, uint64_t Val) { for (Attribute::AttrKind I = Attribute::None; I != Attribute::EndAttrKinds; I = Attribute::AttrKind(I + 1)) { - if (I == Attribute::SanitizeMemTag || - I == Attribute::Dereferenceable || - I == Attribute::DereferenceableOrNull || - I == Attribute::ArgMemOnly || - I == Attribute::AllocSize || - I == Attribute::NoSync) + if (I == Attribute::SanitizeMemTag || I == Attribute::Dereferenceable || + I == Attribute::DereferenceableOrNull || I == Attribute::ArgMemOnly || + I == Attribute::AllocSize || I == Attribute::NoSync || + I == Attribute::Preallocated) continue; if (uint64_t A = (Val & getRawAttributeMask(I))) { if (I == Attribute::Alignment) @@ -1544,6 +1545,8 @@ static Attribute::AttrKind getAttrFromCode(uint64_t Code) { return Attribute::ImmArg; case bitc::ATTR_KIND_SANITIZE_MEMTAG: return Attribute::SanitizeMemTag; + case bitc::ATTR_KIND_PREALLOCATED: + return Attribute::Preallocated; } } @@ -1659,8 +1662,11 @@ Error BitcodeReader::parseAttributeGroupBlock() { Attribute::AttrKind Kind; if (Error Err = parseAttrKind(Record[++i], &Kind)) return Err; - if (Kind == Attribute::ByVal) + if (Kind == Attribute::ByVal) { B.addByValAttr(HasType ? getTypeByID(Record[++i]) : nullptr); + } else if (Kind == Attribute::Preallocated) { + B.addPreallocatedAttr(getTypeByID(Record[++i])); + } } } |