diff options
| author | Erik Desjardins <erikdesjardins@users.noreply.github.com> | 2022-02-21 11:19:16 -0500 |
|---|---|---|
| committer | Erik Desjardins <erikdesjardins@users.noreply.github.com> | 2022-02-26 13:14:55 -0500 |
| commit | 30d3ce06742fc5d0eb844239652a0af4d47bb095 (patch) | |
| tree | d1fa3a83f6d9844567fc46bd59104e7377cfba39 /compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp | |
| parent | 6f681a8eb3fbdf37075ae5f921518f5f4b9306a6 (diff) | |
| download | rust-30d3ce06742fc5d0eb844239652a0af4d47bb095.tar.gz rust-30d3ce06742fc5d0eb844239652a0af4d47bb095.zip | |
Add LLVM attributes in batches instead of individually
This should improve performance.
Diffstat (limited to 'compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp')
| -rw-r--r-- | compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp | 165 |
1 files changed, 60 insertions, 105 deletions
diff --git a/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp b/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp index c8f31adbfd9..632a7985c79 100644 --- a/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp +++ b/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp @@ -232,142 +232,97 @@ static Attribute::AttrKind fromRust(LLVMRustAttribute Kind) { report_fatal_error("bad AttributeKind"); } -template<typename T> static inline void AddAttribute(T *t, unsigned Index, Attribute Attr) { +template<typename T> static inline void AddAttributes(T *t, unsigned Index, + LLVMAttributeRef *Attrs, size_t AttrsLen) { + AttrBuilder B(t->getContext()); + for (LLVMAttributeRef Attr : makeArrayRef(Attrs, AttrsLen)) + B.addAttribute(unwrap(Attr)); + AttributeList PAL = t->getAttributes(); + AttributeList PALNew; #if LLVM_VERSION_LT(14, 0) - t->addAttribute(Index, Attr); + PALNew = PAL.addAttributes(t->getContext(), Index, B); #else - t->addAttributeAtIndex(Index, Attr); + PALNew = PAL.addAttributesAtIndex(t->getContext(), Index, B); #endif + t->setAttributes(PALNew); } -extern "C" void LLVMRustAddCallSiteAttribute(LLVMValueRef Instr, unsigned Index, - LLVMRustAttribute RustAttr) { - CallBase *Call = unwrap<CallBase>(Instr); - Attribute Attr = Attribute::get(Call->getContext(), fromRust(RustAttr)); - AddAttribute(Call, Index, Attr); -} - -extern "C" void LLVMRustAddCallSiteAttrString(LLVMValueRef Instr, unsigned Index, - const char *Name) { - CallBase *Call = unwrap<CallBase>(Instr); - Attribute Attr = Attribute::get(Call->getContext(), Name); - AddAttribute(Call, Index, Attr); -} - -extern "C" void LLVMRustAddAlignmentCallSiteAttr(LLVMValueRef Instr, - unsigned Index, - uint32_t Bytes) { - CallBase *Call = unwrap<CallBase>(Instr); - Attribute Attr = Attribute::getWithAlignment(Call->getContext(), Align(Bytes)); - AddAttribute(Call, Index, Attr); +template<typename T> static inline void RemoveAttributes(T *t, unsigned Index, + LLVMRustAttribute *RustAttrs, + size_t RustAttrsLen) { + AttributeMask Mask; + for (LLVMRustAttribute RustAttr : makeArrayRef(RustAttrs, RustAttrsLen)) + Mask.addAttribute(fromRust(RustAttr)); + AttributeList PAL = t->getAttributes(); + AttributeList PALNew; +#if LLVM_VERSION_LT(14, 0) + PALNew = PAL.removeAttributes(t->getContext(), Index, Mask); +#else + PALNew = PAL.removeAttributesAtIndex(t->getContext(), Index, Mask); +#endif + t->setAttributes(PALNew); } -extern "C" void LLVMRustAddDereferenceableCallSiteAttr(LLVMValueRef Instr, - unsigned Index, - uint64_t Bytes) { - CallBase *Call = unwrap<CallBase>(Instr); - Attribute Attr = Attribute::getWithDereferenceableBytes(Call->getContext(), Bytes); - AddAttribute(Call, Index, Attr); +extern "C" void LLVMRustAddFunctionAttributes(LLVMValueRef Fn, unsigned Index, + LLVMAttributeRef *Attrs, size_t AttrsLen) { + Function *F = unwrap<Function>(Fn); + AddAttributes(F, Index, Attrs, AttrsLen); } -extern "C" void LLVMRustAddDereferenceableOrNullCallSiteAttr(LLVMValueRef Instr, - unsigned Index, - uint64_t Bytes) { - CallBase *Call = unwrap<CallBase>(Instr); - Attribute Attr = Attribute::getWithDereferenceableOrNullBytes(Call->getContext(), Bytes); - AddAttribute(Call, Index, Attr); +extern "C" void LLVMRustRemoveFunctionAttributes(LLVMValueRef Fn, unsigned Index, + LLVMRustAttribute *RustAttrs, + size_t RustAttrsLen) { + Function *F = unwrap<Function>(Fn); + RemoveAttributes(F, Index, RustAttrs, RustAttrsLen); } -extern "C" void LLVMRustAddByValCallSiteAttr(LLVMValueRef Instr, unsigned Index, - LLVMTypeRef Ty) { +extern "C" void LLVMRustAddCallSiteAttributes(LLVMValueRef Instr, unsigned Index, + LLVMAttributeRef *Attrs, size_t AttrsLen) { CallBase *Call = unwrap<CallBase>(Instr); - Attribute Attr = Attribute::getWithByValType(Call->getContext(), unwrap(Ty)); - AddAttribute(Call, Index, Attr); + AddAttributes(Call, Index, Attrs, AttrsLen); } -extern "C" void LLVMRustAddStructRetCallSiteAttr(LLVMValueRef Instr, unsigned Index, - LLVMTypeRef Ty) { - CallBase *Call = unwrap<CallBase>(Instr); - Attribute Attr = Attribute::getWithStructRetType(Call->getContext(), unwrap(Ty)); - AddAttribute(Call, Index, Attr); +extern "C" LLVMAttributeRef LLVMRustCreateAttrNoValue(LLVMContextRef C, + LLVMRustAttribute RustAttr) { + return wrap(Attribute::get(*unwrap(C), fromRust(RustAttr))); } -extern "C" void LLVMRustAddFunctionAttribute(LLVMValueRef Fn, unsigned Index, - LLVMRustAttribute RustAttr) { - Function *A = unwrap<Function>(Fn); - Attribute Attr = Attribute::get(A->getContext(), fromRust(RustAttr)); - AddAttribute(A, Index, Attr); +extern "C" LLVMAttributeRef LLVMRustCreateAttrStringValue(LLVMContextRef C, + const char *Name, + const char *Value) { + return wrap(Attribute::get(*unwrap(C), StringRef(Name), StringRef(Value))); } -extern "C" void LLVMRustAddAlignmentAttr(LLVMValueRef Fn, - unsigned Index, - uint32_t Bytes) { - Function *A = unwrap<Function>(Fn); - AddAttribute(A, Index, Attribute::getWithAlignment( - A->getContext(), llvm::Align(Bytes))); +extern "C" LLVMAttributeRef LLVMRustCreateAlignmentAttr(LLVMContextRef C, + uint64_t Bytes) { + return wrap(Attribute::getWithAlignment(*unwrap(C), llvm::Align(Bytes))); } -extern "C" void LLVMRustAddDereferenceableAttr(LLVMValueRef Fn, unsigned Index, - uint64_t Bytes) { - Function *A = unwrap<Function>(Fn); - AddAttribute(A, Index, Attribute::getWithDereferenceableBytes(A->getContext(), - Bytes)); +extern "C" LLVMAttributeRef LLVMRustCreateDereferenceableAttr(LLVMContextRef C, + uint64_t Bytes) { + return wrap(Attribute::getWithDereferenceableBytes(*unwrap(C), Bytes)); } -extern "C" void LLVMRustAddDereferenceableOrNullAttr(LLVMValueRef Fn, - unsigned Index, - uint64_t Bytes) { - Function *A = unwrap<Function>(Fn); - AddAttribute(A, Index, Attribute::getWithDereferenceableOrNullBytes( - A->getContext(), Bytes)); +extern "C" LLVMAttributeRef LLVMRustCreateDereferenceableOrNullAttr(LLVMContextRef C, + uint64_t Bytes) { + return wrap(Attribute::getWithDereferenceableOrNullBytes(*unwrap(C), Bytes)); } -extern "C" void LLVMRustAddByValAttr(LLVMValueRef Fn, unsigned Index, - LLVMTypeRef Ty) { - Function *F = unwrap<Function>(Fn); - Attribute Attr = Attribute::getWithByValType(F->getContext(), unwrap(Ty)); - AddAttribute(F, Index, Attr); +extern "C" LLVMAttributeRef LLVMRustCreateByValAttr(LLVMContextRef C, LLVMTypeRef Ty) { + return wrap(Attribute::getWithByValType(*unwrap(C), unwrap(Ty))); } -extern "C" void LLVMRustAddStructRetAttr(LLVMValueRef Fn, unsigned Index, - LLVMTypeRef Ty) { - Function *F = unwrap<Function>(Fn); - Attribute Attr = Attribute::getWithStructRetType(F->getContext(), unwrap(Ty)); - AddAttribute(F, Index, Attr); +extern "C" LLVMAttributeRef LLVMRustCreateStructRetAttr(LLVMContextRef C, LLVMTypeRef Ty) { + return wrap(Attribute::getWithStructRetType(*unwrap(C), unwrap(Ty))); } -extern "C" void LLVMRustEmitUWTableAttr(LLVMValueRef Fn, bool Async) { - Function *F = unwrap<Function>(Fn); +extern "C" LLVMAttributeRef LLVMRustCreateUWTableAttr(LLVMContextRef C, bool Async) { #if LLVM_VERSION_LT(15, 0) - Attribute Attr = Attribute::get(F->getContext(), Attribute::UWTable); -#else - Attribute Attr = Attribute::getWithUWTableKind( - F->getContext(), Async ? UWTableKind::Async : UWTableKind::Sync); -#endif - AddAttribute(F, AttributeList::AttrIndex::FunctionIndex, Attr); -} - -extern "C" void LLVMRustAddFunctionAttrStringValue(LLVMValueRef Fn, - unsigned Index, - const char *Name, - const char *Value) { - Function *F = unwrap<Function>(Fn); - AddAttribute(F, Index, Attribute::get( - F->getContext(), StringRef(Name), StringRef(Value))); -} - -extern "C" void LLVMRustRemoveFunctionAttributes(LLVMValueRef Fn, - unsigned Index, - LLVMRustAttribute RustAttr) { - Function *F = unwrap<Function>(Fn); - AttributeList PAL = F->getAttributes(); - AttributeList PALNew; -#if LLVM_VERSION_LT(14, 0) - PALNew = PAL.removeAttribute(F->getContext(), Index, fromRust(RustAttr)); + return wrap(Attribute::get(*unwrap(C), Attribute::UWTable)); #else - PALNew = PAL.removeAttributeAtIndex(F->getContext(), Index, fromRust(RustAttr)); + return wrap(Attribute::getWithUWTableKind( + *unwrap(C), Async ? UWTableKind::Async : UWTableKind::Sync)); #endif - F->setAttributes(PALNew); } // Enable a fast-math flag |
