Index: llvm/trunk/docs/ReleaseNotes.rst =================================================================== --- llvm/trunk/docs/ReleaseNotes.rst +++ llvm/trunk/docs/ReleaseNotes.rst @@ -33,6 +33,12 @@ Non-comprehensive list of changes in this release ================================================= +* The C API functions LLVMAddFunctionAttr, LLVMGetFunctionAttr, + LLVMRemoveFunctionAttr, LLVMAddAttribute, LLVMRemoveAttribute, + LLVMGetAttribute, LLVMAddInstrAttribute and + LLVMRemoveInstrAttribute have been removed. + +* The C API enum LLVMAttribute has been deleted. .. NOTE For small 1-3 sentence descriptions, just add an entry at the end of Index: llvm/trunk/include/llvm-c/Core.h =================================================================== --- llvm/trunk/include/llvm-c/Core.h +++ llvm/trunk/include/llvm-c/Core.h @@ -55,51 +55,6 @@ */ typedef enum { - LLVMZExtAttribute = 1<<0, - LLVMSExtAttribute = 1<<1, - LLVMNoReturnAttribute = 1<<2, - LLVMInRegAttribute = 1<<3, - LLVMStructRetAttribute = 1<<4, - LLVMNoUnwindAttribute = 1<<5, - LLVMNoAliasAttribute = 1<<6, - LLVMByValAttribute = 1<<7, - LLVMNestAttribute = 1<<8, - LLVMReadNoneAttribute = 1<<9, - LLVMReadOnlyAttribute = 1<<10, - LLVMNoInlineAttribute = 1<<11, - LLVMAlwaysInlineAttribute = 1<<12, - LLVMOptimizeForSizeAttribute = 1<<13, - LLVMStackProtectAttribute = 1<<14, - LLVMStackProtectReqAttribute = 1<<15, - LLVMAlignment = 31<<16, - LLVMNoCaptureAttribute = 1<<21, - LLVMNoRedZoneAttribute = 1<<22, - LLVMNoImplicitFloatAttribute = 1<<23, - LLVMNakedAttribute = 1<<24, - LLVMInlineHintAttribute = 1<<25, - LLVMStackAlignment = 7<<26, - LLVMReturnsTwice = 1 << 29, - LLVMUWTable = 1 << 30, - LLVMNonLazyBind = 1 << 31 - - /* FIXME: These attributes are currently not included in the C API as - a temporary measure until the API/ABI impact to the C API is understood - and the path forward agreed upon. - LLVMSanitizeAddressAttribute = 1ULL << 32, - LLVMStackProtectStrongAttribute = 1ULL<<35, - LLVMColdAttribute = 1ULL << 40, - LLVMOptimizeNoneAttribute = 1ULL << 42, - LLVMInAllocaAttribute = 1ULL << 43, - LLVMNonNullAttribute = 1ULL << 44, - LLVMJumpTableAttribute = 1ULL << 45, - LLVMConvergentAttribute = 1ULL << 46, - LLVMSafeStackAttribute = 1ULL << 47, - LLVMSwiftSelfAttribute = 1ULL << 48, - LLVMSwiftErrorAttribute = 1ULL << 49, - */ -} LLVMAttribute; - -typedef enum { /* Terminator Instructions */ LLVMRet = 1, LLVMBr = 2, @@ -2011,8 +1966,6 @@ * * @see llvm::Function::addAttribute() */ -void LLVMAddFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA); - void LLVMAddAttributeAtIndex(LLVMValueRef F, LLVMAttributeIndex Idx, LLVMAttributeRef A); unsigned LLVMGetAttributeCountAtIndex(LLVMValueRef F, LLVMAttributeIndex Idx); @@ -2037,18 +1990,6 @@ const char *V); /** - * Obtain an attribute from a function. - * - * @see llvm::Function::getAttributes() - */ -LLVMAttribute LLVMGetFunctionAttr(LLVMValueRef Fn); - -/** - * Remove an attribute from a function. - */ -void LLVMRemoveFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA); - -/** * @defgroup LLVMCCoreValueFunctionParameters Function Parameters * * Functions in this group relate to arguments/parameters on functions. @@ -2130,25 +2071,6 @@ LLVMValueRef LLVMGetPreviousParam(LLVMValueRef Arg); /** - * Add an attribute to a function argument. - * - * @see llvm::Argument::addAttr() - */ -void LLVMAddAttribute(LLVMValueRef Arg, LLVMAttribute PA); - -/** - * Remove an attribute from a function argument. - * - * @see llvm::Argument::removeAttr() - */ -void LLVMRemoveAttribute(LLVMValueRef Arg, LLVMAttribute PA); - -/** - * Get an attribute from a function argument. - */ -LLVMAttribute LLVMGetAttribute(LLVMValueRef Arg); - -/** * Set the alignment for a function parameter. * * @see llvm::Argument::addAttr() @@ -2596,9 +2518,6 @@ */ unsigned LLVMGetInstructionCallConv(LLVMValueRef Instr); -void LLVMAddInstrAttribute(LLVMValueRef Instr, unsigned index, LLVMAttribute); -void LLVMRemoveInstrAttribute(LLVMValueRef Instr, unsigned index, - LLVMAttribute); void LLVMSetInstrParamAlignment(LLVMValueRef Instr, unsigned index, unsigned Align); Index: llvm/trunk/include/llvm/IR/Attributes.h =================================================================== --- llvm/trunk/include/llvm/IR/Attributes.h +++ llvm/trunk/include/llvm/IR/Attributes.h @@ -391,9 +391,6 @@ // AttributeSet Introspection //===--------------------------------------------------------------------===// - // FIXME: Remove this. - uint64_t Raw(unsigned Index) const; - /// \brief Return a raw pointer that uniquely identifies this attribute list. void *getRawPointer() const { return pImpl; @@ -458,11 +455,6 @@ AttrBuilder() : Attrs(0), Alignment(0), StackAlignment(0), DerefBytes(0), DerefOrNullBytes(0), AllocSizeArgs(0) {} - explicit AttrBuilder(uint64_t Val) - : Attrs(0), Alignment(0), StackAlignment(0), DerefBytes(0), - DerefOrNullBytes(0), AllocSizeArgs(0) { - addRawValue(Val); - } AttrBuilder(const Attribute &A) : Attrs(0), Alignment(0), StackAlignment(0), DerefBytes(0), DerefOrNullBytes(0), AllocSizeArgs(0) { @@ -590,11 +582,6 @@ bool operator!=(const AttrBuilder &B) { return !(*this == B); } - - // FIXME: Remove this in 4.0. - - /// \brief Add the raw value to the internal representation. - AttrBuilder &addRawValue(uint64_t Val); }; namespace AttributeFuncs { Index: llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp =================================================================== --- llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp +++ llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp @@ -1355,6 +1355,98 @@ // Functions for parsing blocks from the bitcode file //===----------------------------------------------------------------------===// +static uint64_t getRawAttributeMask(Attribute::AttrKind Val) { + switch (Val) { + case Attribute::EndAttrKinds: + llvm_unreachable("Synthetic enumerators which should never get here"); + + case Attribute::None: return 0; + case Attribute::ZExt: return 1 << 0; + case Attribute::SExt: return 1 << 1; + case Attribute::NoReturn: return 1 << 2; + case Attribute::InReg: return 1 << 3; + case Attribute::StructRet: return 1 << 4; + case Attribute::NoUnwind: return 1 << 5; + case Attribute::NoAlias: return 1 << 6; + case Attribute::ByVal: return 1 << 7; + case Attribute::Nest: return 1 << 8; + case Attribute::ReadNone: return 1 << 9; + case Attribute::ReadOnly: return 1 << 10; + case Attribute::NoInline: return 1 << 11; + case Attribute::AlwaysInline: return 1 << 12; + case Attribute::OptimizeForSize: return 1 << 13; + case Attribute::StackProtect: return 1 << 14; + case Attribute::StackProtectReq: return 1 << 15; + case Attribute::Alignment: return 31 << 16; + case Attribute::NoCapture: return 1 << 21; + case Attribute::NoRedZone: return 1 << 22; + case Attribute::NoImplicitFloat: return 1 << 23; + case Attribute::Naked: return 1 << 24; + case Attribute::InlineHint: return 1 << 25; + case Attribute::StackAlignment: return 7 << 26; + case Attribute::ReturnsTwice: return 1 << 29; + case Attribute::UWTable: return 1 << 30; + case Attribute::NonLazyBind: return 1U << 31; + case Attribute::SanitizeAddress: return 1ULL << 32; + case Attribute::MinSize: return 1ULL << 33; + case Attribute::NoDuplicate: return 1ULL << 34; + case Attribute::StackProtectStrong: return 1ULL << 35; + case Attribute::SanitizeThread: return 1ULL << 36; + case Attribute::SanitizeMemory: return 1ULL << 37; + case Attribute::NoBuiltin: return 1ULL << 38; + case Attribute::Returned: return 1ULL << 39; + case Attribute::Cold: return 1ULL << 40; + case Attribute::Builtin: return 1ULL << 41; + case Attribute::OptimizeNone: return 1ULL << 42; + case Attribute::InAlloca: return 1ULL << 43; + case Attribute::NonNull: return 1ULL << 44; + case Attribute::JumpTable: return 1ULL << 45; + case Attribute::Convergent: return 1ULL << 46; + case Attribute::SafeStack: return 1ULL << 47; + case Attribute::NoRecurse: return 1ULL << 48; + case Attribute::InaccessibleMemOnly: return 1ULL << 49; + case Attribute::InaccessibleMemOrArgMemOnly: return 1ULL << 50; + case Attribute::SwiftSelf: return 1ULL << 51; + case Attribute::SwiftError: return 1ULL << 52; + case Attribute::WriteOnly: return 1ULL << 53; + case Attribute::Dereferenceable: + llvm_unreachable("dereferenceable attribute not supported in raw format"); + break; + case Attribute::DereferenceableOrNull: + llvm_unreachable("dereferenceable_or_null attribute not supported in raw " + "format"); + break; + case Attribute::ArgMemOnly: + llvm_unreachable("argmemonly attribute not supported in raw format"); + break; + case Attribute::AllocSize: + llvm_unreachable("allocsize not supported in raw format"); + break; + } + llvm_unreachable("Unsupported attribute type"); +} + +static void addRawAttributeValue(AttrBuilder &B, uint64_t Val) { + if (!Val) return; + + for (Attribute::AttrKind I = Attribute::None; I != Attribute::EndAttrKinds; + I = Attribute::AttrKind(I + 1)) { + if (I == Attribute::Dereferenceable || + I == Attribute::DereferenceableOrNull || + I == Attribute::ArgMemOnly || + I == Attribute::AllocSize) + continue; + if (uint64_t A = (Val & getRawAttributeMask(I))) { + if (I == Attribute::Alignment) + B.addAlignmentAttr(1ULL << ((A >> 16) - 1)); + else if (I == Attribute::StackAlignment) + B.addStackAlignmentAttr(1ULL << ((A >> 26)-1)); + else + B.addAttribute(I); + } + } +} + /// \brief This fills an AttrBuilder object with the LLVM attributes that have /// been decoded from the given integer. This function must stay in sync with /// 'encodeLLVMAttributesForBitcode'. @@ -1370,8 +1462,8 @@ if (Alignment) B.addAlignmentAttr(Alignment); - B.addRawValue(((EncodedAttrs & (0xfffffULL << 32)) >> 11) | - (EncodedAttrs & 0xffff)); + addRawAttributeValue(B, ((EncodedAttrs & (0xfffffULL << 32)) >> 11) | + (EncodedAttrs & 0xffff)); } std::error_code BitcodeReader::parseAttributeBlock() { Index: llvm/trunk/lib/IR/AttributeImpl.h =================================================================== --- llvm/trunk/lib/IR/AttributeImpl.h +++ llvm/trunk/lib/IR/AttributeImpl.h @@ -85,9 +85,6 @@ ID.AddString(Kind); if (!Values.empty()) ID.AddString(Values); } - - // FIXME: Remove this! - static uint64_t getAttrMask(Attribute::AttrKind Val); }; //===----------------------------------------------------------------------===// @@ -258,9 +255,6 @@ } } - // FIXME: This atrocity is temporary. - uint64_t Raw(unsigned Index) const; - void dump() const; }; Index: llvm/trunk/lib/IR/Attributes.cpp =================================================================== --- llvm/trunk/lib/IR/Attributes.cpp +++ llvm/trunk/lib/IR/Attributes.cpp @@ -472,78 +472,6 @@ return getKindAsString() < AI.getKindAsString(); } -uint64_t AttributeImpl::getAttrMask(Attribute::AttrKind Val) { - // FIXME: Remove this. - switch (Val) { - case Attribute::EndAttrKinds: - llvm_unreachable("Synthetic enumerators which should never get here"); - - case Attribute::None: return 0; - case Attribute::ZExt: return 1 << 0; - case Attribute::SExt: return 1 << 1; - case Attribute::NoReturn: return 1 << 2; - case Attribute::InReg: return 1 << 3; - case Attribute::StructRet: return 1 << 4; - case Attribute::NoUnwind: return 1 << 5; - case Attribute::NoAlias: return 1 << 6; - case Attribute::ByVal: return 1 << 7; - case Attribute::Nest: return 1 << 8; - case Attribute::ReadNone: return 1 << 9; - case Attribute::ReadOnly: return 1 << 10; - case Attribute::NoInline: return 1 << 11; - case Attribute::AlwaysInline: return 1 << 12; - case Attribute::OptimizeForSize: return 1 << 13; - case Attribute::StackProtect: return 1 << 14; - case Attribute::StackProtectReq: return 1 << 15; - case Attribute::Alignment: return 31 << 16; - case Attribute::NoCapture: return 1 << 21; - case Attribute::NoRedZone: return 1 << 22; - case Attribute::NoImplicitFloat: return 1 << 23; - case Attribute::Naked: return 1 << 24; - case Attribute::InlineHint: return 1 << 25; - case Attribute::StackAlignment: return 7 << 26; - case Attribute::ReturnsTwice: return 1 << 29; - case Attribute::UWTable: return 1 << 30; - case Attribute::NonLazyBind: return 1U << 31; - case Attribute::SanitizeAddress: return 1ULL << 32; - case Attribute::MinSize: return 1ULL << 33; - case Attribute::NoDuplicate: return 1ULL << 34; - case Attribute::StackProtectStrong: return 1ULL << 35; - case Attribute::SanitizeThread: return 1ULL << 36; - case Attribute::SanitizeMemory: return 1ULL << 37; - case Attribute::NoBuiltin: return 1ULL << 38; - case Attribute::Returned: return 1ULL << 39; - case Attribute::Cold: return 1ULL << 40; - case Attribute::Builtin: return 1ULL << 41; - case Attribute::OptimizeNone: return 1ULL << 42; - case Attribute::InAlloca: return 1ULL << 43; - case Attribute::NonNull: return 1ULL << 44; - case Attribute::JumpTable: return 1ULL << 45; - case Attribute::Convergent: return 1ULL << 46; - case Attribute::SafeStack: return 1ULL << 47; - case Attribute::NoRecurse: return 1ULL << 48; - case Attribute::InaccessibleMemOnly: return 1ULL << 49; - case Attribute::InaccessibleMemOrArgMemOnly: return 1ULL << 50; - case Attribute::SwiftSelf: return 1ULL << 51; - case Attribute::SwiftError: return 1ULL << 52; - case Attribute::WriteOnly: return 1ULL << 53; - case Attribute::Dereferenceable: - llvm_unreachable("dereferenceable attribute not supported in raw format"); - break; - case Attribute::DereferenceableOrNull: - llvm_unreachable("dereferenceable_or_null attribute not supported in raw " - "format"); - break; - case Attribute::ArgMemOnly: - llvm_unreachable("argmemonly attribute not supported in raw format"); - break; - case Attribute::AllocSize: - llvm_unreachable("allocsize not supported in raw format"); - break; - } - llvm_unreachable("Unsupported attribute type"); -} - //===----------------------------------------------------------------------===// // AttributeSetNode Definition //===----------------------------------------------------------------------===// @@ -653,39 +581,6 @@ // AttributeSetImpl Definition //===----------------------------------------------------------------------===// -uint64_t AttributeSetImpl::Raw(unsigned Index) const { - for (unsigned I = 0, E = getNumSlots(); I != E; ++I) { - if (getSlotIndex(I) != Index) continue; - const AttributeSetNode *ASN = getSlotNode(I); - uint64_t Mask = 0; - - for (AttributeSetNode::iterator II = ASN->begin(), - IE = ASN->end(); II != IE; ++II) { - Attribute Attr = *II; - - // This cannot handle string attributes. - if (Attr.isStringAttribute()) continue; - - Attribute::AttrKind Kind = Attr.getKindAsEnum(); - - if (Kind == Attribute::Alignment) - Mask |= (Log2_32(ASN->getAlignment()) + 1) << 16; - else if (Kind == Attribute::StackAlignment) - Mask |= (Log2_32(ASN->getStackAlignment()) + 1) << 26; - else if (Kind == Attribute::Dereferenceable) - llvm_unreachable("dereferenceable not supported in bit mask"); - else if (Kind == Attribute::AllocSize) - llvm_unreachable("allocsize not supported in bit mask"); - else - Mask |= AttributeImpl::getAttrMask(Kind); - } - - return Mask; - } - - return 0; -} - LLVM_DUMP_METHOD void AttributeSetImpl::dump() const { AttributeSet(const_cast(this)).dump(); } @@ -1220,11 +1115,6 @@ return pImpl->getSlotAttributes(Slot); } -uint64_t AttributeSet::Raw(unsigned Index) const { - // FIXME: Remove this. - return pImpl ? pImpl->Raw(Index) : 0; -} - LLVM_DUMP_METHOD void AttributeSet::dump() const { dbgs() << "PAL[\n"; @@ -1525,30 +1415,6 @@ DerefBytes == B.DerefBytes; } -AttrBuilder &AttrBuilder::addRawValue(uint64_t Val) { - // FIXME: Remove this in 4.0. - if (!Val) return *this; - - for (Attribute::AttrKind I = Attribute::None; I != Attribute::EndAttrKinds; - I = Attribute::AttrKind(I + 1)) { - if (I == Attribute::Dereferenceable || - I == Attribute::DereferenceableOrNull || - I == Attribute::ArgMemOnly || - I == Attribute::AllocSize) - continue; - if (uint64_t A = (Val & AttributeImpl::getAttrMask(I))) { - Attrs[I] = true; - - if (I == Attribute::Alignment) - Alignment = 1ULL << ((A >> 16) - 1); - else if (I == Attribute::StackAlignment) - StackAlignment = 1ULL << ((A >> 26)-1); - } - } - - return *this; -} - //===----------------------------------------------------------------------===// // AttributeFuncs Function Defintions //===----------------------------------------------------------------------===// Index: llvm/trunk/lib/IR/Core.cpp =================================================================== --- llvm/trunk/lib/IR/Core.cpp +++ llvm/trunk/lib/IR/Core.cpp @@ -1835,17 +1835,6 @@ F->clearGC(); } -void LLVMAddFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA) { - Function *Func = unwrap(Fn); - const AttributeSet PAL = Func->getAttributes(); - AttrBuilder B(PA); - const AttributeSet PALnew = - PAL.addAttributes(Func->getContext(), AttributeSet::FunctionIndex, - AttributeSet::get(Func->getContext(), - AttributeSet::FunctionIndex, B)); - Func->setAttributes(PALnew); -} - void LLVMAddAttributeAtIndex(LLVMValueRef F, LLVMAttributeIndex Idx, LLVMAttributeRef A) { unwrap(F)->addAttribute(Idx, unwrap(A)); @@ -1898,23 +1887,6 @@ Func->addAttributes(Idx, Set); } -void LLVMRemoveFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA) { - Function *Func = unwrap(Fn); - const AttributeSet PAL = Func->getAttributes(); - AttrBuilder B(PA); - const AttributeSet PALnew = - PAL.removeAttributes(Func->getContext(), AttributeSet::FunctionIndex, - AttributeSet::get(Func->getContext(), - AttributeSet::FunctionIndex, B)); - Func->setAttributes(PALnew); -} - -LLVMAttribute LLVMGetFunctionAttr(LLVMValueRef Fn) { - Function *Func = unwrap(Fn); - const AttributeSet PAL = Func->getAttributes(); - return (LLVMAttribute)PAL.Raw(AttributeSet::FunctionIndex); -} - /*--.. Operations on parameters ............................................--*/ unsigned LLVMCountParams(LLVMValueRef FnRef) { @@ -1973,24 +1945,6 @@ return wrap(&*--I); } -void LLVMAddAttribute(LLVMValueRef Arg, LLVMAttribute PA) { - Argument *A = unwrap(Arg); - AttrBuilder B(PA); - A->addAttr(AttributeSet::get(A->getContext(), A->getArgNo() + 1, B)); -} - -void LLVMRemoveAttribute(LLVMValueRef Arg, LLVMAttribute PA) { - Argument *A = unwrap(Arg); - AttrBuilder B(PA); - A->removeAttr(AttributeSet::get(A->getContext(), A->getArgNo() + 1, B)); -} - -LLVMAttribute LLVMGetAttribute(LLVMValueRef Arg) { - Argument *A = unwrap(Arg); - return (LLVMAttribute)A->getParent()->getAttributes(). - Raw(A->getArgNo()+1); -} - void LLVMSetParamAlignment(LLVMValueRef Arg, unsigned align) { Argument *A = unwrap(Arg); AttrBuilder B; @@ -2199,26 +2153,6 @@ .setCallingConv(static_cast(CC)); } -void LLVMAddInstrAttribute(LLVMValueRef Instr, unsigned index, - LLVMAttribute PA) { - CallSite Call = CallSite(unwrap(Instr)); - AttrBuilder B(PA); - Call.setAttributes( - Call.getAttributes().addAttributes(Call->getContext(), index, - AttributeSet::get(Call->getContext(), - index, B))); -} - -void LLVMRemoveInstrAttribute(LLVMValueRef Instr, unsigned index, - LLVMAttribute PA) { - CallSite Call = CallSite(unwrap(Instr)); - AttrBuilder B(PA); - Call.setAttributes(Call.getAttributes() - .removeAttributes(Call->getContext(), index, - AttributeSet::get(Call->getContext(), - index, B))); -} - void LLVMSetInstrParamAlignment(LLVMValueRef Instr, unsigned index, unsigned align) { CallSite Call = CallSite(unwrap(Instr));