Skip to content

Commit bca2ab4

Browse files
committed
LLVMCodeBuilder: Add readonly attribute to some functions
1 parent 44e5da7 commit bca2ab4

File tree

1 file changed

+51
-12
lines changed

1 file changed

+51
-12
lines changed

src/dev/engine/internal/llvm/llvmcodebuilder.cpp

Lines changed: 51 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2615,55 +2615,79 @@ llvm::FunctionCallee LLVMCodeBuilder::resolve_value_assign_copy()
26152615

26162616
llvm::FunctionCallee LLVMCodeBuilder::resolve_value_toDouble()
26172617
{
2618-
return resolveFunction("value_toDouble", llvm::FunctionType::get(m_builder.getDoubleTy(), m_valueDataType->getPointerTo(), false));
2618+
llvm::FunctionCallee callee = resolveFunction("value_toDouble", llvm::FunctionType::get(m_builder.getDoubleTy(), m_valueDataType->getPointerTo(), false));
2619+
llvm::Function *func = llvm::cast<llvm::Function>(callee.getCallee());
2620+
func->addFnAttr(llvm::Attribute::ReadOnly);
2621+
return callee;
26192622
}
26202623

26212624
llvm::FunctionCallee LLVMCodeBuilder::resolve_value_toBool()
26222625
{
2623-
return resolveFunction("value_toBool", llvm::FunctionType::get(m_builder.getInt1Ty(), m_valueDataType->getPointerTo(), false));
2626+
llvm::FunctionCallee callee = resolveFunction("value_toBool", llvm::FunctionType::get(m_builder.getInt1Ty(), m_valueDataType->getPointerTo(), false));
2627+
llvm::Function *func = llvm::cast<llvm::Function>(callee.getCallee());
2628+
func->addFnAttr(llvm::Attribute::ReadOnly);
2629+
return callee;
26242630
}
26252631

26262632
llvm::FunctionCallee LLVMCodeBuilder::resolve_value_toCString()
26272633
{
2634+
// NOTE: This function can't be marked read-only because it allocates on the heap
26282635
return resolveFunction("value_toCString", llvm::FunctionType::get(llvm::PointerType::get(llvm::Type::getInt8Ty(m_llvmCtx), 0), m_valueDataType->getPointerTo(), false));
26292636
}
26302637

26312638
llvm::FunctionCallee LLVMCodeBuilder::resolve_value_doubleToCString()
26322639
{
2640+
// NOTE: This function can't be marked read-only because it allocates on the heap
26332641
return resolveFunction("value_doubleToCString", llvm::FunctionType::get(llvm::PointerType::get(llvm::Type::getInt8Ty(m_llvmCtx), 0), m_builder.getDoubleTy(), false));
26342642
}
26352643

26362644
llvm::FunctionCallee LLVMCodeBuilder::resolve_value_boolToCString()
26372645
{
2646+
// NOTE: This function can't be marked read-only because it allocates on the heap
26382647
return resolveFunction("value_boolToCString", llvm::FunctionType::get(llvm::PointerType::get(llvm::Type::getInt8Ty(m_llvmCtx), 0), m_builder.getInt1Ty(), false));
26392648
}
26402649

26412650
llvm::FunctionCallee LLVMCodeBuilder::resolve_value_stringToDouble()
26422651
{
2643-
return resolveFunction("value_stringToDouble", llvm::FunctionType::get(m_builder.getDoubleTy(), llvm::PointerType::get(llvm::Type::getInt8Ty(m_llvmCtx), 0), false));
2652+
llvm::FunctionCallee callee = resolveFunction("value_stringToDouble", llvm::FunctionType::get(m_builder.getDoubleTy(), llvm::PointerType::get(llvm::Type::getInt8Ty(m_llvmCtx), 0), false));
2653+
llvm::Function *func = llvm::cast<llvm::Function>(callee.getCallee());
2654+
func->addFnAttr(llvm::Attribute::ReadOnly);
2655+
return callee;
26442656
}
26452657

26462658
llvm::FunctionCallee LLVMCodeBuilder::resolve_value_stringToBool()
26472659
{
2648-
return resolveFunction("value_stringToBool", llvm::FunctionType::get(m_builder.getInt1Ty(), llvm::PointerType::get(llvm::Type::getInt8Ty(m_llvmCtx), 0), false));
2660+
llvm::FunctionCallee callee = resolveFunction("value_stringToBool", llvm::FunctionType::get(m_builder.getInt1Ty(), llvm::PointerType::get(llvm::Type::getInt8Ty(m_llvmCtx), 0), false));
2661+
llvm::Function *func = llvm::cast<llvm::Function>(callee.getCallee());
2662+
func->addFnAttr(llvm::Attribute::ReadOnly);
2663+
return callee;
26492664
}
26502665

26512666
llvm::FunctionCallee LLVMCodeBuilder::resolve_value_equals()
26522667
{
26532668
llvm::Type *valuePtr = m_valueDataType->getPointerTo();
2654-
return resolveFunction("value_equals", llvm::FunctionType::get(m_builder.getInt1Ty(), { valuePtr, valuePtr }, false));
2669+
llvm::FunctionCallee callee = resolveFunction("value_equals", llvm::FunctionType::get(m_builder.getInt1Ty(), { valuePtr, valuePtr }, false));
2670+
llvm::Function *func = llvm::cast<llvm::Function>(callee.getCallee());
2671+
func->addFnAttr(llvm::Attribute::ReadOnly);
2672+
return callee;
26552673
}
26562674

26572675
llvm::FunctionCallee LLVMCodeBuilder::resolve_value_greater()
26582676
{
26592677
llvm::Type *valuePtr = m_valueDataType->getPointerTo();
2660-
return resolveFunction("value_greater", llvm::FunctionType::get(m_builder.getInt1Ty(), { valuePtr, valuePtr }, false));
2678+
llvm::FunctionCallee callee = resolveFunction("value_greater", llvm::FunctionType::get(m_builder.getInt1Ty(), { valuePtr, valuePtr }, false));
2679+
llvm::Function *func = llvm::cast<llvm::Function>(callee.getCallee());
2680+
func->addFnAttr(llvm::Attribute::ReadOnly);
2681+
return callee;
26612682
}
26622683

26632684
llvm::FunctionCallee LLVMCodeBuilder::resolve_value_lower()
26642685
{
26652686
llvm::Type *valuePtr = m_valueDataType->getPointerTo();
2666-
return resolveFunction("value_lower", llvm::FunctionType::get(m_builder.getInt1Ty(), { valuePtr, valuePtr }, false));
2687+
llvm::FunctionCallee callee = resolveFunction("value_lower", llvm::FunctionType::get(m_builder.getInt1Ty(), { valuePtr, valuePtr }, false));
2688+
llvm::Function *func = llvm::cast<llvm::Function>(callee.getCallee());
2689+
func->addFnAttr(llvm::Attribute::ReadOnly);
2690+
return callee;
26672691
}
26682692

26692693
llvm::FunctionCallee LLVMCodeBuilder::resolve_list_clear()
@@ -2693,25 +2717,37 @@ llvm::FunctionCallee LLVMCodeBuilder::resolve_list_insert_empty()
26932717
llvm::FunctionCallee LLVMCodeBuilder::resolve_list_data()
26942718
{
26952719
llvm::Type *listPtr = llvm::PointerType::get(llvm::Type::getInt8Ty(m_llvmCtx), 0);
2696-
return resolveFunction("list_data", llvm::FunctionType::get(m_valueDataType->getPointerTo(), { listPtr }, false));
2720+
llvm::FunctionCallee callee = resolveFunction("list_data", llvm::FunctionType::get(m_valueDataType->getPointerTo(), { listPtr }, false));
2721+
llvm::Function *func = llvm::cast<llvm::Function>(callee.getCallee());
2722+
func->addFnAttr(llvm::Attribute::ReadOnly);
2723+
return callee;
26972724
}
26982725

26992726
llvm::FunctionCallee LLVMCodeBuilder::resolve_list_size_ptr()
27002727
{
27012728
llvm::Type *listPtr = llvm::PointerType::get(llvm::Type::getInt8Ty(m_llvmCtx), 0);
2702-
return resolveFunction("list_size_ptr", llvm::FunctionType::get(m_builder.getInt64Ty()->getPointerTo()->getPointerTo(), { listPtr }, false));
2729+
llvm::FunctionCallee callee = resolveFunction("list_size_ptr", llvm::FunctionType::get(m_builder.getInt64Ty()->getPointerTo()->getPointerTo(), { listPtr }, false));
2730+
llvm::Function *func = llvm::cast<llvm::Function>(callee.getCallee());
2731+
func->addFnAttr(llvm::Attribute::ReadOnly);
2732+
return callee;
27032733
}
27042734

27052735
llvm::FunctionCallee LLVMCodeBuilder::resolve_list_alloc_size_ptr()
27062736
{
27072737
llvm::Type *listPtr = llvm::PointerType::get(llvm::Type::getInt8Ty(m_llvmCtx), 0);
2708-
return resolveFunction("list_alloc_size_ptr", llvm::FunctionType::get(m_builder.getInt64Ty()->getPointerTo()->getPointerTo(), { listPtr }, false));
2738+
llvm::FunctionCallee callee = resolveFunction("list_alloc_size_ptr", llvm::FunctionType::get(m_builder.getInt64Ty()->getPointerTo()->getPointerTo(), { listPtr }, false));
2739+
llvm::Function *func = llvm::cast<llvm::Function>(callee.getCallee());
2740+
func->addFnAttr(llvm::Attribute::ReadOnly);
2741+
return callee;
27092742
}
27102743

27112744
llvm::FunctionCallee LLVMCodeBuilder::resolve_list_to_string()
27122745
{
27132746
llvm::Type *pointerType = llvm::PointerType::get(llvm::Type::getInt8Ty(m_llvmCtx), 0);
2714-
return resolveFunction("list_to_string", llvm::FunctionType::get(pointerType, { pointerType }, false));
2747+
llvm::FunctionCallee callee = resolveFunction("list_to_string", llvm::FunctionType::get(pointerType, { pointerType }, false));
2748+
llvm::Function *func = llvm::cast<llvm::Function>(callee.getCallee());
2749+
func->addFnAttr(llvm::Attribute::ReadOnly);
2750+
return callee;
27152751
}
27162752

27172753
llvm::FunctionCallee LLVMCodeBuilder::resolve_llvm_random()
@@ -2742,5 +2778,8 @@ llvm::FunctionCallee LLVMCodeBuilder::resolve_llvm_random_bool()
27422778
llvm::FunctionCallee LLVMCodeBuilder::resolve_strcasecmp()
27432779
{
27442780
llvm::Type *pointerType = llvm::PointerType::get(llvm::Type::getInt8Ty(m_llvmCtx), 0);
2745-
return resolveFunction("strcasecmp", llvm::FunctionType::get(m_builder.getInt32Ty(), { pointerType, pointerType }, false));
2781+
llvm::FunctionCallee callee = resolveFunction("strcasecmp", llvm::FunctionType::get(m_builder.getInt32Ty(), { pointerType, pointerType }, false));
2782+
llvm::Function *func = llvm::cast<llvm::Function>(callee.getCallee());
2783+
func->addFnAttr(llvm::Attribute::ReadOnly);
2784+
return callee;
27462785
}

0 commit comments

Comments
 (0)