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