@@ -1327,7 +1327,13 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
13271327 coro->end ();
13281328 break ;
13291329
1330- // TODO: Implement reporter code type
1330+ case Compiler::CodeType::Reporter: {
1331+ // Use last instruction return value and create a ValueData instance
1332+ assert (!m_instructions.empty ());
1333+ LLVMRegister *ret = m_instructions.back ()->functionReturnReg ;
1334+ m_builder.CreateRet (m_builder.CreateLoad (m_valueDataType, createNewValue (ret))); // return copy
1335+ break ;
1336+ }
13311337 case Compiler::CodeType::HatPredicate:
13321338 // Use last instruction return value
13331339 assert (!m_instructions.empty ());
@@ -2031,7 +2037,10 @@ std::string LLVMCodeBuilder::getMainFunctionName(BlockPrototype *procedureProtot
20312037 name = " script" ;
20322038 break ;
20332039
2034- // TODO: Implement reporter code type
2040+ case Compiler::CodeType::Reporter:
2041+ name = " reporter" ;
2042+ break ;
2043+
20352044 case Compiler::CodeType::HatPredicate:
20362045 name = " predicate" ;
20372046 break ;
@@ -2048,6 +2057,7 @@ std::string LLVMCodeBuilder::getResumeFunctionName(BlockPrototype *procedureProt
20482057llvm::FunctionType *LLVMCodeBuilder::getMainFunctionType (BlockPrototype *procedurePrototype)
20492058{
20502059 // void *f(ExecutionContext *, Target *, ValueData **, List **, (warp arg), (procedure args...))
2060+ // ValueData f(...) (reporters)
20512061 // bool f(...) (hat predicates)
20522062 llvm::Type *pointerType = llvm::PointerType::get (llvm::Type::getInt8Ty (m_llvmCtx), 0 );
20532063 std::vector<llvm::Type *> argTypes = { pointerType, pointerType, pointerType, pointerType };
@@ -2071,7 +2081,10 @@ llvm::FunctionType *LLVMCodeBuilder::getMainFunctionType(BlockPrototype *procedu
20712081 retType = pointerType;
20722082 break ;
20732083
2074- // TODO: Implement reporter code type
2084+ case Compiler::CodeType::Reporter:
2085+ retType = m_valueDataType;
2086+ break ;
2087+
20752088 case Compiler::CodeType::HatPredicate:
20762089 retType = m_builder.getInt1Ty ();
20772090 break ;
@@ -2902,6 +2915,43 @@ llvm::Value *LLVMCodeBuilder::createValue(LLVMRegister *reg)
29022915 return reg->value ;
29032916}
29042917
2918+ llvm::Value *LLVMCodeBuilder::createNewValue (LLVMRegister *reg)
2919+ {
2920+ // Same as createValue(), but creates a copy of the contents
2921+ // NOTE: It is the caller's responsibility to free the value.
2922+ if (reg->isConst ())
2923+ return createValue (reg);
2924+ else if (reg->isRawValue ) {
2925+ if (reg->type () == Compiler::StaticType::String) {
2926+ llvm::Value *value = castRawValue (reg, reg->type ());
2927+ llvm::Value *ret = addAlloca (m_valueDataType);
2928+
2929+ // Allocate string
2930+ llvm::Value *result = m_builder.CreateCall (resolve_string_pool_new (), m_builder.getInt1 (false )); // false: do not free after thread is dead
2931+ // NOTE: Do not free later
2932+
2933+ // Copy string
2934+ m_builder.CreateCall (resolve_string_assign (), { result, value });
2935+
2936+ // Store string pointer
2937+ llvm::Value *valueField = m_builder.CreateStructGEP (m_valueDataType, ret, 0 );
2938+ m_builder.CreateStore (value, valueField);
2939+
2940+ // Store type
2941+ llvm::Value *typeField = m_builder.CreateStructGEP (m_valueDataType, ret, 1 );
2942+ m_builder.CreateStore (m_builder.getInt32 (static_cast <uint32_t >(ValueType::String)), typeField);
2943+
2944+ return ret;
2945+ } else
2946+ return createValue (reg);
2947+ } else {
2948+ llvm::Value *ret = addAlloca (m_valueDataType);
2949+ m_builder.CreateCall (resolve_value_init (), { ret });
2950+ m_builder.CreateCall (resolve_value_assign_copy (), { ret, reg->value });
2951+ return ret;
2952+ }
2953+ }
2954+
29052955llvm::Value *LLVMCodeBuilder::createComparison (LLVMRegister *arg1, LLVMRegister *arg2, Comparison type)
29062956{
29072957 auto type1 = arg1->type ();
@@ -3372,6 +3422,11 @@ llvm::FunctionCallee LLVMCodeBuilder::resolve_string_alloc()
33723422 return resolveFunction (" string_alloc" , llvm::FunctionType::get (m_builder.getVoidTy (), { m_stringPtrType->getPointerTo (), m_builder.getInt64Ty () }, false ));
33733423}
33743424
3425+ llvm::FunctionCallee LLVMCodeBuilder::resolve_string_assign ()
3426+ {
3427+ return resolveFunction (" string_assign" , llvm::FunctionType::get (m_builder.getVoidTy (), { m_stringPtrType->getPointerTo (), m_stringPtrType->getPointerTo () }, false ));
3428+ }
3429+
33753430llvm::FunctionCallee LLVMCodeBuilder::resolve_string_compare_case_sensitive ()
33763431{
33773432 llvm::Type *stringPtr = m_stringPtrType->getPointerTo ();
0 commit comments