Build without warnings
[satcheck.git] / storeloadset.cc
1 /*      Copyright (c) 2015 Regents of the University of California
2  *
3  *      Author: Brian Demsky <bdemsky@uci.edu>
4  *
5  *      This program is free software; you can redistribute it and/or
6  *      modify it under the terms of the GNU General Public License
7  *      version 2 as published by the Free Software Foundation.
8  */
9
10 #include "storeloadset.h"
11 #include "eprecord.h"
12 #include "valuerecord.h"
13 #include "constgen.h"
14
15 StoreLoadSet::StoreLoadSet() :
16         addrencodings(NULL),
17         valencodings(NULL) {
18 }
19
20 StoreLoadSet::~StoreLoadSet() {
21         if (addrencodings!=NULL) {
22                 delete addrencodings;
23                 delete valencodings;
24         }
25         addrvars.resetandfree();
26         valvars.resetandfree();
27         valrmwrvars.resetandfree();
28 }
29
30 void StoreLoadSet::add(EPRecord *op) {
31         storeloadset.add(op);
32         IntIterator * it=op->getSet(VC_ADDRINDEX)->iterator();
33         while(it->hasNext())
34                 addresses.add(it->next());
35         delete it;
36
37         if (op->getType()==STORE ||
38                         op->getType()==RMW) {
39                 it=op->getStoreSet()->iterator();
40                 while(it->hasNext())
41                         values.add(it->next());
42                 delete it;
43         }
44 }
45
46 void StoreLoadSet::genEncoding() {
47         addrencodings=new ValueRecord(&addresses);
48         valencodings=new ValueRecord(&values);
49 }
50
51 const void * StoreLoadSet::getAddressEncoding(ConstGen *cg, EPRecord *op, bool *sat) {
52         Constraint **vars=getAddrVars(cg, op);
53         return (const void *) addrencodings->getValue(vars, sat);
54 }
55
56 uint64_t StoreLoadSet::getValueEncoding(ConstGen *cg, EPRecord *op,  bool *sat) {
57         Constraint **vars=getValVars(cg, op);
58         return valencodings->getValue(vars, sat);
59 }
60
61 uint64_t StoreLoadSet::getRMWRValueEncoding(ConstGen *cg, EPRecord *op, bool *sat) {
62         Constraint **vars=getRMWRValVars(cg, op);
63         return valencodings->getValue(vars, sat);
64 }
65
66 Constraint * StoreLoadSet::getAddressEncoding(ConstGen *cg, EPRecord *op, const void * addr) {
67         if (addrencodings==NULL)
68                 genEncoding();
69         Constraint **vars=getAddrVars(cg, op);
70         return addrencodings->getValueEncoding(vars, (uint64_t) addr);
71 }
72
73 Constraint * StoreLoadSet::getValueEncoding(ConstGen *cg, EPRecord *op, uint64_t val) {
74         if (valencodings==NULL)
75                 genEncoding();
76         Constraint **vars=getValVars(cg, op);
77         return valencodings->getValueEncoding(vars, val);
78 }
79
80 Constraint * StoreLoadSet::getRMWRValueEncoding(ConstGen *cg, EPRecord *op, uint64_t val) {
81         if (valencodings==NULL)
82                 genEncoding();
83         Constraint **vars=getRMWRValVars(cg, op);
84         return valencodings->getValueEncoding(vars, val);
85 }
86
87 Constraint ** StoreLoadSet::getAddrVars(ConstGen *cg, EPRecord * op) {
88         Constraint **vars=addrvars.get(op);
89         if (vars==NULL) {
90                 int numvars=addrencodings->getNumVars();
91                 vars=(Constraint **)model_malloc(numvars*sizeof(Constraint *));
92                 cg->getArrayNewVars(numvars, vars);
93                 addrvars.put(op, vars);
94         }
95         return vars;
96 }
97
98 Constraint ** StoreLoadSet::getValVars(ConstGen *cg, EPRecord * op) {
99         Constraint **vars=valvars.get(op);
100         if (vars==NULL) {
101                 int numvars=valencodings->getNumVars();
102                 vars=(Constraint **)model_malloc(numvars*sizeof(Constraint *));
103                 cg->getArrayNewVars(numvars, vars);
104                 valvars.put(op, vars);
105         }
106         return vars;
107 }
108
109 Constraint ** StoreLoadSet::getRMWRValVars(ConstGen *cg, EPRecord * op) {
110         Constraint **vars=valrmwrvars.get(op);
111         if (vars==NULL) {
112                 int numvars=valencodings->getNumVars();
113                 vars=(Constraint **)model_malloc(numvars*sizeof(Constraint *));
114                 cg->getArrayNewVars(numvars, vars);
115                 valrmwrvars.put(op, vars);
116         }
117         return vars;
118 }
119
120 uint StoreLoadSet::getNumValVars() {
121         if (valencodings==NULL)
122                 genEncoding();
123         return valencodings->getNumVars();
124 }
125
126 uint StoreLoadSet::getNumAddrVars() {
127         if (addrencodings==NULL)
128                 genEncoding();
129         return addrencodings->getNumVars();
130 }