static void trace_dynamic(compile_t* c, LLVMValueRef ctx, LLVMValueRef object, ast_t* type, ast_t* orig, ast_t* tuple, LLVMBasicBlockRef next_block) { switch(ast_id(type)) { case TK_UNIONTYPE: case TK_ISECTTYPE: trace_dynamic_union_or_isect(c, ctx, object, type, orig, tuple, next_block); break; case TK_TUPLETYPE: { // This is a boxed tuple. Trace the box, then handle the elements. trace_tag(c, ctx, object); LLVMValueRef desc = gendesc_fetch(c, object); LLVMValueRef ptr = gendesc_ptr_to_fields(c, object, desc); trace_dynamic_tuple(c, ctx, ptr, desc, type, orig, tuple); break; } case TK_NOMINAL: trace_dynamic_nominal(c, ctx, object, type, orig, tuple, next_block); break; default: {} } }
void MultiAggregate::computeInferences( vector< Literal >& inferences, Literal lit ) { assert_msg( positionInTrail.find( lit.getId() ) != positionInTrail.end(), "Cannot find " << lit << " in trail" ); assert( inferences.empty() ); unsigned int position = positionInTrail[ lit.getId() ]; assert_msg( position < trail.size(), position << " >= " << trail.size() ); trace_msg( multiaggregates, 3, "Computing inferences for literal " << lit ); computeInferences( inferences, position, trail[ position ].isId(), trail[ position ].position() ); trace_action( multiaggregates, 5, { trace_tag( cerr, multiaggregates, 5 ); cerr << "Inferences are:"; for( unsigned int i = 0; i < inferences.size(); i++ ) cerr << " " << inferences[ i ]; cerr << endl; } );
void gentrace(compile_t* c, LLVMValueRef ctx, LLVMValueRef value, ast_t* type) { switch(trace_type(type)) { case TRACE_NONE: assert(0); return; case TRACE_PRIMITIVE: return; case TRACE_MAYBE: trace_maybe(c, ctx, value, type); return; case TRACE_ACTOR: trace_actor(c, ctx, value); return; case TRACE_KNOWN_VAL: trace_known(c, ctx, value, type, true); return; case TRACE_UNKNOWN_VAL: trace_unknown(c, ctx, value, true); return; case TRACE_KNOWN: trace_known(c, ctx, value, type, false); return; case TRACE_UNKNOWN: trace_unknown(c, ctx, value, false); return; case TRACE_TAG: trace_tag(c, ctx, value); return; case TRACE_TAG_OR_ACTOR: trace_tag_or_actor(c, ctx, value); return; case TRACE_DYNAMIC: { LLVMBasicBlockRef next_block = codegen_block(c, ""); trace_dynamic(c, ctx, value, type, type, NULL, next_block); LLVMBuildBr(c->builder, next_block); LLVMPositionBuilderAtEnd(c->builder, next_block); return; } case TRACE_TUPLE: trace_tuple(c, ctx, value, type); return; } }
static void trace_maybe(compile_t* c, LLVMValueRef ctx, LLVMValueRef value, ast_t* type, bool tag) { ast_t* type_args = ast_childidx(type, 2); ast_t* elem = ast_child(type_args); if(is_machine_word(elem)) return; LLVMValueRef test = genprim_maybe_is_null(c, elem, value); LLVMBasicBlockRef is_false = codegen_block(c, ""); LLVMBasicBlockRef is_true = codegen_block(c, ""); LLVMBuildCondBr(c->builder, test, is_true, is_false); LLVMPositionBuilderAtEnd(c->builder, is_false); if(tag) trace_tag(c, ctx, value); else gentrace(c, ctx, value, elem); LLVMBuildBr(c->builder, is_true); LLVMPositionBuilderAtEnd(c->builder, is_true); }
bool gentrace(compile_t* c, LLVMValueRef ctx, LLVMValueRef value, ast_t* type) { bool tag = trace_as_tag(c, value, type); switch(ast_id(type)) { case TK_UNIONTYPE: case TK_ISECTTYPE: { if(tag) trace_tag_or_actor(c, ctx, value); else trace_unknown(c, ctx, value); return true; } case TK_TUPLETYPE: return trace_tuple(c, ctx, value, type); case TK_NOMINAL: { switch(ast_id((ast_t*)ast_data(type))) { case TK_INTERFACE: case TK_TRAIT: if(tag) trace_tag_or_actor(c, ctx, value); else trace_unknown(c, ctx, value); return true; case TK_PRIMITIVE: // Do nothing. return false; case TK_STRUCT: case TK_CLASS: if(tag) { if(is_maybe(type)) trace_maybe(c, ctx, value, type, true); else trace_tag(c, ctx, value); return true; } if(is_maybe(type)) { trace_maybe(c, ctx, value, type, false); return true; } return trace_known(c, ctx, value, type); case TK_ACTOR: trace_actor(c, ctx, value); return true; default: {} } break; } default: {} } assert(0); return false; }