Computer Laboratory

Instrumentation.h
Go to the documentation of this file.
1 
2 /*
3  * Copyright (c) 2012-2013 Jonathan Anderson
4  * All rights reserved.
5  *
6  * This software was developed by SRI International and the University of
7  * Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237)
8  * ("CTSRD"), as part of the DARPA CRASH research programme.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  * notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  * notice, this list of conditions and the following disclaimer in the
17  * documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  */
31 
32 #ifndef TESLA_INSTRUMENTATION_H
33 #define TESLA_INSTRUMENTATION_H
34 
35 #include "llvm/ADT/SmallVector.h"
36 #include "llvm/ADT/StringRef.h"
37 #include "llvm/IR/Function.h"
38 #include "llvm/IR/IRBuilder.h"
39 
40 #include "Transition.h"
41 
42 #include "tesla.pb.h"
43 #include <libtesla.h>
44 
45 namespace llvm {
46  class BasicBlock;
47  class Constant;
48  class Instruction;
49  class LLVMContext;
50  class Module;
51  class Twine;
52  class Type;
53  class Value;
54 }
55 
56 namespace tesla {
57 
58 class Automaton;
59 class FieldAssignTransition;
60 class FnTransition;
61 class Transition;
62 
65 public:
66  void AppendInstrumentation(const Automaton&, const FunctionEvent&,
68 
69 protected:
70  FnInstrumentation(llvm::Module& M, const llvm::Function *TargetFn,
71  llvm::Function *InstrFn, FunctionEvent::Direction Dir)
72  : M(M), TargetFn(TargetFn), InstrFn(InstrFn), Dir(Dir)
73  {
74  }
75 
76  llvm::Module& M;
77  const llvm::Function *TargetFn;
78  llvm::Function *InstrFn;
80 };
81 
84 public:
87  virtual bool Instrument(llvm::Instruction&) = 0;
88 };
89 
91 typedef llvm::SmallVector<llvm::Value*,3> ArgVector;
92 
94 typedef llvm::SmallVector<llvm::Type*,3> TypeVector;
95 
97 llvm::Type* IntPtrType(llvm::Module&);
98 
100 llvm::StructType* TransitionType(llvm::Module&);
101 
103 llvm::StructType* TransitionSetType(llvm::Module&);
104 
109 llvm::Constant* TeslaContext(AutomatonDescription::Context Context,
110  llvm::LLVMContext& Ctx);
111 
113 llvm::BasicBlock* FindBlock(llvm::StringRef Name, llvm::Function&);
114 
116 llvm::Function* FindStateUpdateFn(llvm::Module&,
117  llvm::Type *IntType);
118 
125 llvm::Value* Cast(llvm::Value *From, llvm::StringRef Name,
126  llvm::Type *NewType, llvm::IRBuilder<>&);
127 
134 llvm::BasicBlock* CreateInstrPreamble(llvm::Module& Mod, llvm::Function *F,
135  const llvm::Twine& Prefix,
136  bool SuppressDebugInstrumentation);
137 
139 llvm::Value* ConstructKey(llvm::IRBuilder<>&, llvm::Module&,
140  llvm::ArrayRef<llvm::Value*> Args);
141 
143 llvm::Constant* ConstructTransition(llvm::IRBuilder<>&, llvm::Module&,
144  const Transition&);
145 
147 llvm::Constant* ConstructTransitions(llvm::IRBuilder<>&, llvm::Module&,
148  const TEquivalenceClass&);
149 
151 llvm::Function* FunctionInstrumentation(llvm::Module&, const llvm::Function&,
153  FunctionEvent::CallContext,
154  bool SuppressDebugInstr);
155 
157 llvm::Function* StructInstrumentation(llvm::Module&, llvm::StructType*,
158  llvm::StringRef FieldName, size_t Index,
159  bool Store, bool SuppressDebugInstr);
160 }
161 
162 #endif /* !TESLA_INSTRUMENTATION_H */