Swift Calling Convention: add swifterror attribute.
A ``swifterror`` attribute can be applied to a function parameter or an AllocaInst. This commit does not include any target-specific change. The target-specific optimization will come as a follow-up patch. Differential Revision: http://reviews.llvm.org/D18092 llvm-svn: 265189
This commit is contained in:
@@ -1317,6 +1317,8 @@ static Attribute::AttrKind getAttrFromCode(uint64_t Code) {
|
||||
return Attribute::SanitizeThread;
|
||||
case bitc::ATTR_KIND_SANITIZE_MEMORY:
|
||||
return Attribute::SanitizeMemory;
|
||||
case bitc::ATTR_KIND_SWIFT_ERROR:
|
||||
return Attribute::SwiftError;
|
||||
case bitc::ATTR_KIND_SWIFT_SELF:
|
||||
return Attribute::SwiftSelf;
|
||||
case bitc::ATTR_KIND_UW_TABLE:
|
||||
@@ -4843,10 +4845,11 @@ std::error_code BitcodeReader::parseFunctionBody(Function *F) {
|
||||
uint64_t AlignRecord = Record[3];
|
||||
const uint64_t InAllocaMask = uint64_t(1) << 5;
|
||||
const uint64_t ExplicitTypeMask = uint64_t(1) << 6;
|
||||
// Reserve bit 7 for SwiftError flag.
|
||||
// const uint64_t SwiftErrorMask = uint64_t(1) << 7;
|
||||
const uint64_t FlagMask = InAllocaMask | ExplicitTypeMask;
|
||||
const uint64_t SwiftErrorMask = uint64_t(1) << 7;
|
||||
const uint64_t FlagMask = InAllocaMask | ExplicitTypeMask |
|
||||
SwiftErrorMask;
|
||||
bool InAlloca = AlignRecord & InAllocaMask;
|
||||
bool SwiftError = AlignRecord & SwiftErrorMask;
|
||||
Type *Ty = getTypeByID(Record[0]);
|
||||
if ((AlignRecord & ExplicitTypeMask) == 0) {
|
||||
auto *PTy = dyn_cast_or_null<PointerType>(Ty);
|
||||
@@ -4865,6 +4868,7 @@ std::error_code BitcodeReader::parseFunctionBody(Function *F) {
|
||||
return error("Invalid record");
|
||||
AllocaInst *AI = new AllocaInst(Ty, Size, Align);
|
||||
AI->setUsedWithInAlloca(InAlloca);
|
||||
AI->setSwiftError(SwiftError);
|
||||
I = AI;
|
||||
InstructionList.push_back(I);
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user