16749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni/* 26749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni * Copyright 2016, The Android Open Source Project 36749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni * 46749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni * Licensed under the Apache License, Version 2.0 (the "License"); 56749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni * you may not use this file except in compliance with the License. 66749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni * You may obtain a copy of the License at 76749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni * 86749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni * http://www.apache.org/licenses/LICENSE-2.0 96749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni * 106749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni * Unless required by applicable law or agreed to in writing, software 116749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni * distributed under the License is distributed on an "AS IS" BASIS, 126749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni * See the License for the specific language governing permissions and 146749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni * limitations under the License. 156749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni */ 166749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni 176749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni#include "InlinePreparationPass.h" 186749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni 196749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni#include "llvm/IR/Module.h" 206749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni#include "llvm/Pass.h" 216749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni#include "llvm/Support/Debug.h" 22b83f1f4d77c7624b9e8dc11beec8f796ff841918I-Jui (Ray) Sung#include "llvm/Support/raw_ostream.h" 236749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni 24eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni#include "Context.h" 25c7b3a43821ccf0f2b13840246e1895744799cf6bYang Ni 266749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni#define DEBUG_TYPE "rs2spirv-inline" 276749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni 286749f541c20e86f5deb6fd421ed5849ef43c275cYang Niusing namespace llvm; 296749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni 306749f541c20e86f5deb6fd421ed5849ef43c275cYang Ninamespace rs2spirv { 316749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni 326749f541c20e86f5deb6fd421ed5849ef43c275cYang Ninamespace { 336749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni 346749f541c20e86f5deb6fd421ed5849ef43c275cYang Niclass InlinePreparationPass : public ModulePass { 356749f541c20e86f5deb6fd421ed5849ef43c275cYang Nipublic: 366749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni static char ID; 37eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni explicit InlinePreparationPass() : ModulePass(ID) {} 386749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni 396749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni const char *getPassName() const override { return "InlinePreparationPass"; } 406749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni 416749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni bool runOnModule(Module &M) override { 426749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni DEBUG(dbgs() << "InlinePreparationPass\n"); 436749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni 44eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni rs2spirv::Context &Ctxt = rs2spirv::Context::getInstance(); 456749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni 466749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni for (auto &F : M.functions()) { 47eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni if (F.isDeclaration()) { 486749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni continue; 49eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni } 506749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni 51eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni if (Ctxt.isForEachKernel(F.getName())) { 526749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni continue; // Skip kernels. 53eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni } 546749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni 556749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni F.addFnAttr(Attribute::AlwaysInline); 566749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni F.setLinkage(GlobalValue::InternalLinkage); 57eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni 58eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni DEBUG(dbgs() << "Marked as alwaysinline:\t" << F.getName() << '\n'); 596749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni } 606749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni 61eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni // Returns true, because this pass modifies the Module. 626749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni return true; 636749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni } 646749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni}; 65eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni 667974fc03e11f3a8dd40f794f3b33b4889483090cRahul Chaudhry} // namespace 676749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni 686749f541c20e86f5deb6fd421ed5849ef43c275cYang Nichar InlinePreparationPass::ID = 0; 696749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni 70eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang NiModulePass *createInlinePreparationPass() { 71eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni return new InlinePreparationPass(); 726749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni} 736749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni 746749f541c20e86f5deb6fd421ed5849ef43c275cYang Ni} // namespace rs2spirv 75