1552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines/*
2552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines * Copyright 2013, 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 "llvm/IR/Module.h"
18552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines#include "llvm/Pass.h"
19552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines
20552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hinesnamespace slang {
21552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines
22552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines// Remove any readnone/readonly attributes from function parameters.
23552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines// Jellybean's LLVM version didn't support readnone/readonly as anything
24552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines// other than function attributes, so it will fail verification otherwise.
25552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines// Since we never ran the verifier in Jellybean, it ends up with potential
26552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines// crashes deeper in CodeGen.
27552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hinesclass StripUnknownAttributes : public llvm::ModulePass {
28552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hinespublic:
29552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines  static char ID;
30552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines
31552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines  StripUnknownAttributes();
32552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines
33552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines  bool runOnFunction(llvm::Function &F);
34552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines
35552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines  // We have to use a ModulePass, since a FunctionPass only gets run on
36552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines  // defined Functions (and not declared Functions).
37552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines  virtual bool runOnModule(llvm::Module &M);
38552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines};
39552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines
40552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hinesllvm::ModulePass * createStripUnknownAttributesPass();
41552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines
42552d872e5cdc883d9f8e76d8c67d3a82e3ece488Stephen Hines}  // namespace slang
43