Update copyright to LGPL on all files
[dyninst.git] / dyninstAPI / src / emitter.h
1 /*
2  * Copyright (c) 1996-2009 Barton P. Miller
3  * 
4  * We provide the Paradyn Parallel Performance Tools (below
5  * described as "Paradyn") on an AS IS basis, and do not warrant its
6  * validity or performance.  We reserve the right to update, modify,
7  * or discontinue this software at any time.  We shall have no
8  * obligation to supply such updates or modifications or any other
9  * form of support to you.
10  * 
11  * By your use of Paradyn, you understand and agree that we (or any
12  * other person or entity with proprietary rights in Paradyn) are
13  * under no obligation to provide either maintenance services,
14  * update services, notices of latent defects, or correction of
15  * defects for Paradyn.
16  * 
17  * This library is free software; you can redistribute it and/or
18  * modify it under the terms of the GNU Lesser General Public
19  * License as published by the Free Software Foundation; either
20  * version 2.1 of the License, or (at your option) any later version.
21  * 
22  * This library is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25  * Lesser General Public License for more details.
26  * 
27  * You should have received a copy of the GNU Lesser General Public
28  * License along with this library; if not, write to the Free Software
29  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
30  */
31
32 /*
33  * emit-x86.h - x86 & AMD64 code generators
34  * $Id: emitter.h,v 1.10 2008/03/25 19:24:29 bernat Exp $
35  */
36
37 #ifndef _EMITTER_H
38 #define _EMITTER_H
39
40 #include "common/h/headers.h"
41 #include "dyninstAPI/src/instPoint.h"
42 #include "dyninstAPI/src/baseTramp.h"
43 #include "dyninstAPI/src/ast.h"
44
45 class codeGen;
46 class registerSpace;
47 class baseTramp;
48
49 class registerSlot;
50
51 // class for encapsulating
52 // platform dependent code generation functions
53 class Emitter {
54
55  public:
56     virtual ~Emitter() {};
57     virtual codeBufIndex_t emitIf(Register expr_reg, Register target, RegControl rc, codeGen &gen) = 0;
58     virtual void emitOp(unsigned opcode, Register dest, Register src1, Register src2, codeGen &gen) = 0;
59     virtual void emitOpImm(unsigned opcode1, unsigned opcode2, Register dest, Register src1, RegValue src2imm,
60                            codeGen &gen) = 0;
61     virtual void emitRelOp(unsigned op, Register dest, Register src1, Register src2, codeGen &gen) = 0;
62     virtual void emitRelOpImm(unsigned op, Register dest, Register src1, RegValue src2imm, codeGen &gen) = 0;
63     virtual void emitDiv(Register dest, Register src1, Register src2, codeGen &gen) = 0;
64     virtual void emitTimesImm(Register dest, Register src1, RegValue src2imm, codeGen &gen) = 0;
65     virtual void emitDivImm(Register dest, Register src1, RegValue src2imm, codeGen &gen) = 0;
66     virtual void emitLoad(Register dest, Address addr, int size, codeGen &gen) = 0;
67     virtual void emitLoadConst(Register dest, Address imm, codeGen &gen) = 0;
68     virtual void emitLoadIndir(Register dest, Register addr_reg, int size, codeGen &gen) = 0;
69
70     virtual bool emitLoadRelative(Register dest, Address offset, Register base, codeGen &gen) = 0;
71     virtual bool emitLoadRelative(registerSlot *dest, Address offset, registerSlot *base, codeGen &gen) = 0;
72
73     virtual void emitLoadShared(opCode op, Register dest, const image_variable *var, bool is_local, int size, codeGen &gen, Address offset) = 0;
74
75     virtual void emitLoadFrameAddr(Register dest, Address offset, codeGen &gen) = 0;
76
77     // These implicitly use the stored original/non-inst value
78     virtual void emitLoadOrigFrameRelative(Register dest, Address offset, codeGen &gen) = 0;
79     virtual void emitLoadOrigRegRelative(Register dest, Address offset, Register base, codeGen &gen, bool store) = 0;
80     virtual void emitLoadOrigRegister(Address register_num, Register dest, codeGen &gen) = 0;
81     
82     virtual void emitStoreOrigRegister(Address register_num, Register dest, codeGen &gen) = 0;
83
84     virtual void emitStore(Address addr, Register src, int size, codeGen &gen) = 0;
85     virtual void emitStoreIndir(Register addr_reg, Register src, int size, codeGen &gen) = 0;
86     virtual void emitStoreFrameRelative(Address offset, Register src, Register scratch, int size, codeGen &gen) = 0;
87
88     virtual void emitStoreRelative(Register source, Address offset, Register base, codeGen &gen) = 0;
89     virtual void emitStoreRelative(registerSlot *source, Address offset, registerSlot *base, codeGen &gen) = 0;
90
91     virtual void emitStoreShared(Register source, const image_variable *var, bool is_local, int size, codeGen &gen) = 0;
92
93     virtual bool emitMoveRegToReg(Register src, Register dest, codeGen &gen) = 0;
94     virtual bool emitMoveRegToReg(registerSlot *src, registerSlot *dest, codeGen &gen) = 0;
95
96     virtual Register emitCall(opCode op, codeGen &gen, const pdvector<AstNodePtr> &operands,
97                               bool noCost, int_function *callee) = 0;
98     virtual void emitGetRetVal(Register dest, bool addr_of, codeGen &gen) = 0;
99     virtual void emitGetParam(Register dest, Register param_num, instPointType_t pt_type, bool addr_of, codeGen &gen) = 0;
100     virtual void emitFuncJump(int_function *f, instPointType_t ptType, codeGen &gen) = 0;
101     virtual void emitASload(int ra, int rb, int sc, long imm, Register dest, codeGen &gen) = 0;
102     virtual void emitCSload(int ra, int rb, int sc, long imm, Register dest, codeGen &gen) = 0;
103     virtual void emitPushFlags(codeGen &gen) = 0;
104     virtual void emitRestoreFlags(codeGen &gen, unsigned offset) = 0;
105     // Built-in offset...
106     virtual void emitRestoreFlagsFromStackSlot(codeGen &gen) = 0;
107     virtual bool emitBTSaves(baseTramp* bt, baseTrampInstance *inst, codeGen &gen) = 0;
108     virtual bool emitBTRestores(baseTramp* bt, baseTrampInstance *bti, codeGen &gen) = 0;
109     virtual void emitStoreImm(Address addr, int imm, codeGen &gen, bool noCost) = 0;
110     virtual void emitAddSignedImm(Address addr, int imm, codeGen &gen, bool noCost) = 0;
111     virtual bool emitPush(codeGen &, Register) = 0;
112     virtual bool emitPop(codeGen &, Register) = 0;
113     virtual bool emitAdjustStackPointer(int index, codeGen &gen) = 0;
114     
115     virtual bool clobberAllFuncCall(registerSpace *rs,int_function *callee) = 0;
116
117     Address getInterModuleFuncAddr(int_function *func, codeGen& gen);
118     Address getInterModuleVarAddr(const image_variable *var, codeGen& gen);
119 };
120
121 #endif