Skip to content

Commit 87a025a

Browse files
committed
LLVMBuildUtils: Use type-specific functions for string casting
1 parent 7976cc0 commit 87a025a

File tree

1 file changed

+40
-20
lines changed

1 file changed

+40
-20
lines changed

src/engine/internal/llvm/llvmbuildutils.cpp

Lines changed: 40 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -434,10 +434,12 @@ llvm::Value *LLVMBuildUtils::castValue(LLVMRegister *reg, Compiler::StaticType t
434434
return m_builder.CreateUIToFP(boolValue, m_builder.getDoubleTy());
435435
}
436436

437-
case Compiler::StaticType::String:
437+
case Compiler::StaticType::String: {
438438
// Convert to double
439-
// TODO: Use value_stringToDouble()
440-
return m_builder.CreateCall(m_functions.resolve_value_toDouble(), reg->value);
439+
llvm::Value *ptr = m_builder.CreateStructGEP(m_valueDataType, reg->value, 0);
440+
llvm::Value *stringPtr = m_builder.CreateLoad(m_stringPtrType->getPointerTo(), ptr);
441+
return m_builder.CreateCall(m_functions.resolve_value_stringToDouble(), stringPtr);
442+
}
441443

442444
default:
443445
assert(false);
@@ -486,8 +488,9 @@ llvm::Value *LLVMBuildUtils::castValue(LLVMRegister *reg, Compiler::StaticType t
486488
sw->addCase(m_builder.getInt32(static_cast<uint32_t>(ValueType::String)), stringBlock);
487489

488490
m_builder.SetInsertPoint(stringBlock);
489-
// TODO: Use value_stringToDouble()
490-
llvm::Value *stringResult = m_builder.CreateCall(m_functions.resolve_value_toDouble(), reg->value);
491+
llvm::Value *ptr = m_builder.CreateStructGEP(m_valueDataType, reg->value, 0);
492+
llvm::Value *stringPtr = m_builder.CreateLoad(m_stringPtrType->getPointerTo(), ptr);
493+
llvm::Value *stringResult = m_builder.CreateCall(m_functions.resolve_value_stringToDouble(), stringPtr);
491494
m_builder.CreateBr(mergeBlock);
492495
results.push_back({ stringBlock, stringResult });
493496
}
@@ -529,10 +532,12 @@ llvm::Value *LLVMBuildUtils::castValue(LLVMRegister *reg, Compiler::StaticType t
529532
return m_builder.CreateLoad(m_builder.getInt1Ty(), ptr);
530533
}
531534

532-
case Compiler::StaticType::String:
535+
case Compiler::StaticType::String: {
533536
// Convert to bool
534-
// TODO: Use value_stringToBool()
535-
return m_builder.CreateCall(m_functions.resolve_value_toBool(), reg->value);
537+
llvm::Value *ptr = m_builder.CreateStructGEP(m_valueDataType, reg->value, 0);
538+
llvm::Value *stringPtr = m_builder.CreateLoad(m_stringPtrType->getPointerTo(), ptr);
539+
return m_builder.CreateCall(m_functions.resolve_value_stringToBool(), stringPtr);
540+
}
536541

537542
default:
538543
assert(false);
@@ -581,8 +586,9 @@ llvm::Value *LLVMBuildUtils::castValue(LLVMRegister *reg, Compiler::StaticType t
581586
sw->addCase(m_builder.getInt32(static_cast<uint32_t>(ValueType::String)), stringBlock);
582587

583588
m_builder.SetInsertPoint(stringBlock);
584-
// TODO: Use value_stringToBool()
585-
llvm::Value *stringResult = m_builder.CreateCall(m_functions.resolve_value_toBool(), reg->value);
589+
llvm::Value *ptr = m_builder.CreateStructGEP(m_valueDataType, reg->value, 0);
590+
llvm::Value *stringPtr = m_builder.CreateLoad(m_stringPtrType->getPointerTo(), ptr);
591+
llvm::Value *stringResult = m_builder.CreateCall(m_functions.resolve_value_stringToBool(), stringPtr);
586592
m_builder.CreateBr(mergeBlock);
587593
results.push_back({ stringBlock, stringResult });
588594
}
@@ -611,13 +617,22 @@ llvm::Value *LLVMBuildUtils::castValue(LLVMRegister *reg, Compiler::StaticType t
611617
if (singleType) {
612618
// Handle single type cases directly
613619
switch (type) {
614-
case Compiler::StaticType::Number:
620+
case Compiler::StaticType::Number: {
621+
// Cast double to string
622+
llvm::Value *ptr = m_builder.CreateStructGEP(m_valueDataType, reg->value, 0);
623+
llvm::Value *value = m_builder.CreateLoad(m_builder.getDoubleTy(), ptr);
624+
llvm::Value *stringPtr = m_builder.CreateCall(m_functions.resolve_value_doubleToStringPtr(), value);
625+
freeStringLater(stringPtr);
626+
return stringPtr;
627+
}
628+
615629
case Compiler::StaticType::Bool: {
616-
// Cast to string
617-
// TODO: Use value_doubleToStringPtr() and value_boolToStringPtr()
618-
llvm::Value *ptr = m_builder.CreateCall(m_functions.resolve_value_toStringPtr(), reg->value);
619-
freeStringLater(ptr);
620-
return ptr;
630+
// Cast bool to string
631+
llvm::Value *ptr = m_builder.CreateStructGEP(m_valueDataType, reg->value, 0);
632+
llvm::Value *value = m_builder.CreateLoad(m_builder.getInt1Ty(), ptr);
633+
llvm::Value *stringPtr = m_builder.CreateCall(m_functions.resolve_value_boolToStringPtr(), value);
634+
// NOTE: Dot not deallocate later
635+
return stringPtr;
621636
}
622637

623638
case Compiler::StaticType::String: {
@@ -648,8 +663,9 @@ llvm::Value *LLVMBuildUtils::castValue(LLVMRegister *reg, Compiler::StaticType t
648663
sw->addCase(m_builder.getInt32(static_cast<uint32_t>(ValueType::Number)), numberBlock);
649664

650665
m_builder.SetInsertPoint(numberBlock);
651-
// TODO: Use value_doubleToStringPtr()
652-
llvm::Value *numberResult = m_builder.CreateCall(m_functions.resolve_value_toStringPtr(), reg->value);
666+
llvm::Value *ptr = m_builder.CreateStructGEP(m_valueDataType, reg->value, 0);
667+
llvm::Value *value = m_builder.CreateLoad(m_builder.getDoubleTy(), ptr);
668+
llvm::Value *numberResult = m_builder.CreateCall(m_functions.resolve_value_doubleToStringPtr(), value);
653669
m_builder.CreateBr(mergeBlock);
654670
results.push_back({ numberBlock, numberResult });
655671
}
@@ -659,9 +675,13 @@ llvm::Value *LLVMBuildUtils::castValue(LLVMRegister *reg, Compiler::StaticType t
659675
llvm::BasicBlock *boolBlock = llvm::BasicBlock::Create(m_llvmCtx, "bool", m_function);
660676
sw->addCase(m_builder.getInt32(static_cast<uint32_t>(ValueType::Bool)), boolBlock);
661677

678+
// Since the value is deallocated later, we need to create a copy
662679
m_builder.SetInsertPoint(boolBlock);
663-
// TODO: Use value_boolToStringPtr()
664-
llvm::Value *boolResult = m_builder.CreateCall(m_functions.resolve_value_toStringPtr(), reg->value);
680+
llvm::Value *ptr = m_builder.CreateStructGEP(m_valueDataType, reg->value, 0);
681+
llvm::Value *value = m_builder.CreateLoad(m_builder.getInt1Ty(), ptr);
682+
llvm::Value *stringPtr = m_builder.CreateCall(m_functions.resolve_value_boolToStringPtr(), value);
683+
llvm::Value *boolResult = m_builder.CreateCall(m_functions.resolve_string_pool_new(), m_builder.getInt1(true));
684+
m_builder.CreateCall(m_functions.resolve_string_assign(), { boolResult, stringPtr });
665685
m_builder.CreateBr(mergeBlock);
666686
results.push_back({ boolBlock, boolResult });
667687
}

0 commit comments

Comments
 (0)