| //===- AddStubs.cpp - Add Stubs Pass --------------------------------------===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file was developed by the LLVM research group and is distributed under |
| // the University of Illinois Open Source License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file implements a stub adder pass. Because class2llvm is not able to |
| // compile all of java at the moment, this pass is used to add dummy returns |
| // to those functions. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #define DEBUG_TYPE "addstubs" |
| |
| #include <llvm/Pass.h> |
| #include <llvm/Function.h> |
| #include <llvm/Module.h> |
| #include <llvm/Type.h> |
| #include <llvm/Instructions.h> |
| #include <llvm/Constants.h> |
| #include <llvm/Support/Debug.h> |
| |
| using namespace llvm; |
| |
| namespace { |
| |
| static Constant* ALL_ONES = ConstantUInt::getAllOnesValue(Type::ULongTy); |
| |
| struct AddStubs : public ModulePass { |
| virtual bool runOnModule(Module &M) { |
| for (Module::iterator F = M.begin(), E = M.end(); F != E; ++F) |
| if (F->empty() && |
| (F->getName().find("java") != std::string::npos || |
| F->getName().find("gnu") != std::string::npos)) { |
| DEBUG(std::cerr << "Stubbing out: " << F->getName() << '\n'); |
| BasicBlock* entry = new BasicBlock("entry", F); |
| if (F->getReturnType() == Type::VoidTy) |
| new ReturnInst(NULL, entry); |
| else |
| new ReturnInst( |
| new CastInst(ALL_ONES, F->getReturnType(), "dummy-value", entry), |
| entry); |
| } |
| return true; |
| } |
| }; |
| RegisterOpt<AddStubs> X("addstubs", "Add Stubs pass"); |
| } |