1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
|
//===----------------------------------------------------------------------===//
//
// Copyright (c) 2012, 2016 The University of Utah
// All rights reserved.
//
// This file is distributed under the University of Illinois Open Source
// License. See the file COPYING for details.
//
//===----------------------------------------------------------------------===//
#ifndef SIMPLE_INLINER_H
#define SIMPLE_INLINER_H
#include <string>
#include <vector>
#include <utility>
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/DenseMap.h"
#include "Transformation.h"
namespace clang {
class DeclGroupRef;
class ASTContext;
class FunctionDecl;
class CallExpr;
class DeclRefExpr;
class ReturnStmt;
class Expr;
class Stmt;
}
class SimpleInlinerCollectionVisitor;
class SimpleInlinerFunctionVisitor;
class SimpleInlinerFunctionStmtVisitor;
class SimpleInlinerStmtVisitor;
class SimpleInliner : public Transformation {
friend class SimpleInlinerCollectionVisitor;
friend class SimpleInlinerFunctionVisitor;
friend class SimpleInlinerFunctionStmtVisitor;
friend class SimpleInlinerStmtVisitor;
public:
SimpleInliner(const char *TransName, const char *Desc)
: Transformation(TransName, Desc),
CollectionVisitor(NULL),
FunctionVisitor(NULL),
FunctionStmtVisitor(NULL),
StmtVisitor(NULL),
NameQueryWrap(NULL),
TheCallExpr(NULL),
TheCaller(NULL),
CurrentFD(NULL),
TheStmt(NULL),
SingleMaxNumStmts(25),
MaxNumStmts(10),
TmpVarName(""),
NeedParen(false),
NamePostfix(0)
{ }
~SimpleInliner(void);
private:
typedef llvm::SmallVector<clang::ReturnStmt *, 5> ReturnStmtsVector;
typedef llvm::SmallVector<const clang::DeclRefExpr *, 5> ParmRefsVector;
typedef llvm::DenseMap<clang::FunctionDecl *, unsigned int>
FunctionDeclToNumCallsMap;
typedef llvm::DenseMap<clang::FunctionDecl *, unsigned int>
FunctionDeclToNumStmtsMap;
virtual void Initialize(clang::ASTContext &context);
virtual bool HandleTopLevelDecl(clang::DeclGroupRef D);
virtual void HandleTranslationUnit(clang::ASTContext &Ctx);
void replaceCallExpr(void);
void doAnalysis(void);
bool isValidArgExpr(const clang::Expr *E);
bool hasValidArgExprs(const clang::CallExpr *CE);
void createReturnVar(void);
void generateParamStrings(void);
void copyFunctionBody(void);
std::string getNewTmpName(void);
void getValidFunctionDecls(void);
void removeFunctionBody(void);
void sortReturnStmtsByOffs(const char *StartBuf,
std::vector< std::pair<clang::ReturnStmt *, int> > &SortedReturnStmts);
void insertReturnStmt
(std::vector< std::pair<clang::ReturnStmt *, int> > &SortedReturnStmts,
clang::ReturnStmt *RS, int Off);
bool hasNameClash(const std::string &ParmName, const clang::Expr *E);
FunctionDeclToNumCallsMap FunctionDeclNumCalls;
FunctionDeclToNumStmtsMap FunctionDeclNumStmts;
llvm::DenseMap<clang::CallExpr *, clang::FunctionDecl *> CalleeToCallerMap;
llvm::SmallVector<clang::CallExpr *, 10> AllCallExprs;
llvm::SmallSet<clang::FunctionDecl *, 10> ValidFunctionDecls;
llvm::SmallVector<std::string, 10> ParmStrings;
llvm::SmallVector<std::string, 4> ParmsWithNameClash;
ReturnStmtsVector ReturnStmts;
ParmRefsVector ParmRefs;
SimpleInlinerCollectionVisitor *CollectionVisitor;
SimpleInlinerFunctionVisitor *FunctionVisitor;
SimpleInlinerFunctionStmtVisitor *FunctionStmtVisitor;
SimpleInlinerStmtVisitor *StmtVisitor;
TransNameQueryWrap *NameQueryWrap;
clang::CallExpr *TheCallExpr;
clang::FunctionDecl *TheCaller;
clang::FunctionDecl *CurrentFD;
clang::Stmt *TheStmt;
// MaxNumStmts for a function with single call site
const unsigned int SingleMaxNumStmts;
// MaxNumStmts for a function with multiple call sites
const unsigned int MaxNumStmts;
std::string TmpVarName;
bool NeedParen;
unsigned int NamePostfix;
// Unimplemented
SimpleInliner(void);
SimpleInliner(const SimpleInliner &);
void operator=(const SimpleInliner &);
};
#endif
|