1552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines/* 288cd94d5165bf8a266d3f3095946fc25bc4809afDavid Gross * Copyright 2017, The Android Open Source Project 3552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines * 4552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines * Licensed under the Apache License, Version 2.0 (the "License"); 5552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines * you may not use this file except in compliance with the License. 6552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines * You may obtain a copy of the License at 7552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines * 8552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines * http://www.apache.org/licenses/LICENSE-2.0 9552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines * 10552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines * Unless required by applicable law or agreed to in writing, software 11552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines * distributed under the License is distributed on an "AS IS" BASIS, 12552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines * See the License for the specific language governing permissions and 14552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines * limitations under the License. 15552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines */ 16552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines 17552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines#include "strip_unknown_attributes.h" 18552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines 1988cd94d5165bf8a266d3f3095946fc25bc4809afDavid Gross#include "llvm/IR/Function.h" 20552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines 2188cd94d5165bf8a266d3f3095946fc25bc4809afDavid Grossnamespace slang { 22552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines 2388cd94d5165bf8a266d3f3095946fc25bc4809afDavid Grossbool stripUnknownAttributes(llvm::Function &F) { 24552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines bool changed = false; 25552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines for (llvm::Function::arg_iterator I = F.arg_begin(), E = F.arg_end(); 26552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines I != E; ++I) { 27552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines llvm::Argument &A = *I; 28552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines // Remove any readnone/readonly attributes from function parameters. 29552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines if (A.onlyReadsMemory()) { 30552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines llvm::AttrBuilder B; 31552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines B.addAttribute(llvm::Attribute::ReadNone); 32552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines B.addAttribute(llvm::Attribute::ReadOnly); 33552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines llvm::AttributeSet ToStrip = llvm::AttributeSet::get(F.getContext(), 34552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines A.getArgNo() + 1, B); 35552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines A.removeAttr(ToStrip); 36552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines changed = true; 37552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines } 38552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines } 39041656a24663cb4f7a61a598e848f217c893cebfStephen Hines F.removeFnAttr(llvm::Attribute::ArgMemOnly); 40552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines return changed; 41552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines} 42552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines 43552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines} // namespace slang 44