source: translator/ResolvExpr/ConversionCost.cc@ 643a2e1

ADT aaron-thesis arm-eh ast-experimental cleanup-dtors ctor deferred_resn demangler enum forall-pointer-decay gc_noraii jacob/cs343-translation jenkins-sandbox memory new-ast new-ast-unique-expr new-env no_list persistent-indexer pthread-emulation qualifiedEnum resolv-new string with_gc
Last change on this file since 643a2e1 was 51b73452, checked in by Peter A. Buhr <pabuhr@…>, 11 years ago

initial commit

  • Property mode set to 100644
File size: 8.8 KB
Line 
1/*
2 * This file is part of the Cforall project
3 *
4 * $Id: ConversionCost.cc,v 1.11 2005/08/29 20:14:15 rcbilson Exp $
5 *
6 */
7
8#include "ConversionCost.h"
9#include "typeops.h"
10#include "SynTree/Type.h"
11#include "SynTree/Visitor.h"
12#include "SymTab/Indexer.h"
13
14
15namespace ResolvExpr {
16
17const Cost Cost::zero = Cost( 0, 0, 0 );
18const Cost Cost::infinity = Cost( -1, -1, -1 );
19
20Cost
21conversionCost( Type *src, Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env )
22{
23 if( TypeInstType *destAsTypeInst = dynamic_cast< TypeInstType* >( dest ) ) {
24 EqvClass eqvClass;
25 NamedTypeDecl *namedType;
26/// std::cout << "type inst " << destAsTypeInst->get_name();
27 if( env.lookup( destAsTypeInst->get_name(), eqvClass ) ) {
28 return conversionCost( src, eqvClass.type, indexer, env );
29 } else if( ( namedType = indexer.lookupType( destAsTypeInst->get_name() ) ) ) {
30/// std::cout << " found" << std::endl;
31 TypeDecl *type = dynamic_cast< TypeDecl* >( namedType );
32 // all typedefs should be gone by this point
33 assert( type );
34 if( type->get_base() ) {
35 return conversionCost( src, type->get_base(), indexer, env ) + Cost( 0, 0, 1 );
36 }
37 }
38/// std::cout << " not found" << std::endl;
39 }
40/// std::cout << "src is ";
41/// src->print( std::cout );
42/// std::cout << std::endl << "dest is ";
43/// dest->print( std::cout );
44/// std::cout << std::endl << "env is" << std::endl;
45/// env.print( std::cout, 8 );
46 if( typesCompatibleIgnoreQualifiers( src, dest, indexer, env ) ) {
47/// std::cout << "compatible!" << std::endl;
48 return Cost( 0, 0, 0 );
49 } else if( dynamic_cast< VoidType* >( dest ) ) {
50 return Cost( 0, 0, 1 );
51 } else {
52 ConversionCost converter( dest, indexer, env );
53 src->accept( converter );
54 if( converter.get_cost() == Cost::infinity ) {
55 return Cost::infinity;
56 } else {
57 return converter.get_cost() + Cost( 0, 0, 0 );
58 }
59 }
60}
61
62ConversionCost::ConversionCost( Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env )
63 : dest( dest ), indexer( indexer ), cost( Cost::infinity ), env( env )
64{
65}
66
67/*
68Old
69===
70 Double
71 |
72 Float
73 |
74 ULong
75 / \
76 UInt Long
77 \ /
78 Int
79 |
80 Ushort
81 |
82 Short
83 |
84 Uchar
85 / \
86 Schar Char
87
88New
89===
90 +-----LongDoubleComplex--+
91 LongDouble--+ | +-LongDoubleImag
92 | +---DoubleComplex---+ |
93 Double------+ | +----DoubleImag
94 | +-FloatComplex-+ |
95 Float---------+ +-------FloatImag
96 |
97 ULongLong
98 |
99 LongLong
100 |
101 ULong
102 / \
103 UInt Long
104 \ /
105 Int
106 |
107 Ushort
108 |
109 Short
110 |
111 Uchar
112 / \
113 Schar Char
114 \ /
115 Bool
116*/
117
118static const int costMatrix[ BasicType::NUMBER_OF_BASIC_TYPES ][ BasicType::NUMBER_OF_BASIC_TYPES ] =
119{
120/* Src \ Dest: Bool Char SChar UChar Short UShort Int UInt Long ULong LLong ULLong Float Double LDbl FCplex DCplex LDCplex FImag DImag LDImag */
121/* Bool */ { 0, 1, 1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10, 11, 12, 11, 12, 13, -1, -1, -1 },
122/* Char */ { -1, 0, -1, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10, 11, 10, 11, 12, -1, -1, -1 },
123/* SChar */ { -1, -1, 0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10, 11, 10, 11, 12, -1, -1, -1 },
124/* UChar */ { -1, -1, -1, 0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10, 9, 10, 11, -1, -1, -1 },
125/* Short */ { -1, -1, -1, -1, 0, 1, 2, 3, 3, 4, 5, 6, 7, 8, 9, 8, 9, 10, -1, -1, -1 },
126/* UShort */ { -1, -1, -1, -1, -1, 0, 1, 2, 2, 3, 4, 5, 6, 7, 8, 7, 8, 9, -1, -1, -1 },
127/* Int */ { -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 3, 4, 5, 6, 7, 6, 7, 8, -1, -1, -1 },
128/* UInt */ { -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, 2, 3, 4, 5, 6, 5, 6, 7, -1, -1, -1 },
129/* Long */ { -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 5, 6, 7, -1, -1, -1 },
130/* ULong */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 4, 5, 6, -1, -1, -1 },
131/* LLong */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 3, 4, 5, -1, -1, -1 },
132/* ULLong */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 2, 3, 4, -1, -1, -1 },
133/* Float */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 1, 2, 3, -1, -1, -1 },
134/* Double */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, -1, 1, 2, -1, -1, -1 },
135/* LDbl */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, 1, -1, -1, -1 },
136/* FCplex */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, -1, -1, -1 },
137/* DCplex */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, -1, -1, -1 },
138/* LDCplex */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1 },
139/* FImag */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 2, 3, 0, 1, 2 },
140/* DImag */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 2, -1, 0, 1 },
141/* LDImag */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, 0 }
142};
143
144void
145ConversionCost::visit(VoidType *voidType)
146{
147 cost = Cost::infinity;
148}
149
150void
151ConversionCost::visit(BasicType *basicType)
152{
153 if( BasicType *destAsBasic = dynamic_cast< BasicType* >( dest ) ) {
154 int tableResult = costMatrix[ basicType->get_kind() ][ destAsBasic->get_kind() ];
155 if( tableResult == -1 ) {
156 cost = Cost( 1, 0, 0 );
157 } else {
158 cost = Cost( 0, 0, tableResult );
159 }
160 }
161}
162
163void
164ConversionCost::visit(PointerType *pointerType)
165{
166 if( PointerType *destAsPtr = dynamic_cast< PointerType* >( dest ) ) {
167 if( pointerType->get_base()->get_qualifiers() <= destAsPtr->get_base()->get_qualifiers() && typesCompatibleIgnoreQualifiers( pointerType->get_base(), destAsPtr->get_base(), indexer, env ) ) {
168 cost = Cost( 0, 0, 1 );
169 } else {
170 int assignResult = ptrsAssignable( pointerType->get_base(), destAsPtr->get_base(), env );
171 if( assignResult < 0 ) {
172 cost = Cost( 0, 0, 1 );
173 } else if( assignResult > 0 ) {
174 cost = Cost( 1, 0, 0 );
175 }
176 }
177 }
178}
179
180void
181ConversionCost::visit(ArrayType *arrayType)
182{
183}
184
185void
186ConversionCost::visit(FunctionType *functionType)
187{
188}
189
190void
191ConversionCost::visit(StructInstType *inst)
192{
193 if( StructInstType *destAsInst = dynamic_cast< StructInstType* >( dest ) ) {
194 if( inst->get_name() == destAsInst->get_name() ) {
195 cost = Cost::zero;
196 }
197 }
198}
199
200void
201ConversionCost::visit(UnionInstType *inst)
202{
203 if( StructInstType *destAsInst = dynamic_cast< StructInstType* >( dest ) ) {
204 if( inst->get_name() == destAsInst->get_name() ) {
205 cost = Cost::zero;
206 }
207 }
208}
209
210void
211ConversionCost::visit(EnumInstType *inst)
212{
213 static Type::Qualifiers q;
214 static BasicType integer( q, BasicType::SignedInt );
215 integer.accept( *this );
216 if( cost < Cost( 1, 0, 0 ) ) {
217 cost.incSafe();
218 }
219}
220
221void
222ConversionCost::visit(ContextInstType *inst)
223{
224}
225
226void
227ConversionCost::visit(TypeInstType *inst)
228{
229 EqvClass eqvClass;
230 NamedTypeDecl *namedType;
231 if( env.lookup( inst->get_name(), eqvClass ) ) {
232 cost = conversionCost( eqvClass.type, dest, indexer, env );
233 } else if( TypeInstType *destAsInst = dynamic_cast< TypeInstType* >( dest ) ) {
234 if( inst->get_name() == destAsInst->get_name() ) {
235 cost = Cost::zero;
236 }
237 } else if( ( namedType = indexer.lookupType( inst->get_name() ) ) ) {
238 TypeDecl *type = dynamic_cast< TypeDecl* >( namedType );
239 // all typedefs should be gone by this point
240 assert( type );
241 if( type->get_base() ) {
242 cost = conversionCost( type->get_base(), dest, indexer, env ) + Cost( 0, 0, 1 );
243 }
244 }
245}
246
247void
248ConversionCost::visit(TupleType *tupleType)
249{
250 Cost c;
251 if( TupleType *destAsTuple = dynamic_cast< TupleType* >( dest ) ) {
252 std::list< Type* >::const_iterator srcIt = tupleType->get_types().begin();
253 std::list< Type* >::const_iterator destIt = destAsTuple->get_types().begin();
254 while( srcIt != tupleType->get_types().end() ) {
255 Cost newCost = conversionCost( *srcIt++, *destIt++, indexer, env );
256 if( newCost == Cost::infinity ) {
257 return;
258 }
259 c += newCost;
260 }
261 if( destIt != destAsTuple->get_types().end() ) {
262 cost = Cost::infinity;
263 } else {
264 cost = c;
265 }
266 }
267}
268
269} // namespace ResolvExpr
Note: See TracBrowser for help on using the repository browser.