Skip to content

Commit f28ddd4

Browse files
committed
Add integer support for local variables
1 parent 78f993b commit f28ddd4

File tree

7 files changed

+56
-5
lines changed

7 files changed

+56
-5
lines changed

src/engine/internal/llvm/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ target_sources(scratchcpp
1515
llvmloop.h
1616
llvmcoroutine.cpp
1717
llvmcoroutine.h
18+
llvmlocalvariableinfo.h
1819
llvmvariableptr.h
1920
llvmlistptr.h
2021
llvmtypes.cpp

src/engine/internal/llvm/instructions/variables.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,12 @@ ProcessResult Variables::process(LLVMInstruction *ins)
4444
LLVMInstruction *Variables::buildCreateLocalVariable(LLVMInstruction *ins)
4545
{
4646
assert(ins->args.empty());
47+
LLVMLocalVariableInfo *info = ins->localVarInfo;
48+
49+
info->isInt = m_utils.addAlloca(m_builder.getInt1Ty());
50+
info->intValue = m_utils.addAlloca(m_builder.getInt64Ty());
51+
m_builder.CreateStore(m_builder.getInt1(false), info->isInt);
52+
m_builder.CreateStore(llvm::ConstantInt::get(m_builder.getInt64Ty(), 0, true), info->isInt);
4753

4854
LLVMConstantRegister null(ins->functionReturnReg->type(), Value());
4955
ins->functionReturnReg->value = m_utils.createValue(&null);
@@ -55,22 +61,22 @@ LLVMInstruction *Variables::buildWriteLocalVariable(LLVMInstruction *ins)
5561
assert(ins->args.size() == 2);
5662
const auto &arg1 = ins->args[0];
5763
const auto &arg2 = ins->args[1];
64+
LLVMLocalVariableInfo *info = ins->localVarInfo;
5865
llvm::Value *typeVar = m_utils.addAlloca(m_builder.getInt32Ty());
5966
m_builder.CreateStore(m_builder.getInt32(static_cast<uint32_t>(m_utils.mapType(arg2.first))), typeVar);
6067

61-
// TODO: Add integer support for local variables
62-
llvm::Value *isIntVar = m_utils.addAlloca(m_builder.getInt1Ty());
63-
llvm::Value *intVar = m_utils.addAlloca(m_builder.getInt64Ty());
64-
65-
m_utils.createValueStore(arg1.second->value, typeVar, isIntVar, intVar, arg2.second, arg2.first, arg2.first);
68+
m_utils.createValueStore(arg1.second->value, typeVar, info->isInt, info->intValue, arg2.second, arg2.first, arg2.first);
6669
return ins->next;
6770
}
6871

6972
LLVMInstruction *Variables::buildReadLocalVariable(LLVMInstruction *ins)
7073
{
7174
assert(ins->args.size() == 1);
7275
const auto &arg = ins->args[0];
76+
LLVMLocalVariableInfo *info = ins->localVarInfo;
7377
ins->functionReturnReg->value = m_utils.castValue(arg.second, ins->functionReturnReg->type());
78+
ins->functionReturnReg->isInt = m_builder.CreateLoad(m_builder.getInt1Ty(), info->isInt);
79+
ins->functionReturnReg->intValue = m_builder.CreateLoad(m_builder.getInt64Ty(), info->intValue);
7480
return ins->next;
7581
}
7682

src/engine/internal/llvm/llvmbuildutils.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,12 @@ LLVMCoroutine *LLVMBuildUtils::coroutine() const
298298
return m_coroutine.get();
299299
}
300300

301+
void LLVMBuildUtils::createLocalVariableInfo(CompilerLocalVariable *variable)
302+
{
303+
if (m_localVariables.find(variable) == m_localVariables.cend())
304+
m_localVariables[variable] = LLVMLocalVariableInfo();
305+
}
306+
301307
void LLVMBuildUtils::createVariablePtr(Variable *variable)
302308
{
303309
if (m_variablePtrs.find(variable) == m_variablePtrs.cend())
@@ -310,6 +316,12 @@ void LLVMBuildUtils::createListPtr(List *list)
310316
m_listPtrs[list] = LLVMListPtr();
311317
}
312318

319+
LLVMLocalVariableInfo &LLVMBuildUtils::localVariableInfo(CompilerLocalVariable *variable)
320+
{
321+
assert(m_localVariables.find(variable) != m_localVariables.cend());
322+
return m_localVariables[variable];
323+
}
324+
313325
LLVMVariablePtr &LLVMBuildUtils::variablePtr(Variable *variable)
314326
{
315327
assert(m_variablePtrs.find(variable) != m_variablePtrs.cend());

src/engine/internal/llvm/llvmbuildutils.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <scratchcpp/valuedata.h>
66

77
#include "llvmfunctions.h"
8+
#include "llvmlocalvariableinfo.h"
89
#include "llvmvariableptr.h"
910
#include "llvmlistptr.h"
1011
#include "llvmcoroutine.h"
@@ -61,9 +62,11 @@ class LLVMBuildUtils
6162

6263
LLVMCoroutine *coroutine() const;
6364

65+
void createLocalVariableInfo(CompilerLocalVariable *variable);
6466
void createVariablePtr(Variable *variable);
6567
void createListPtr(List *list);
6668

69+
LLVMLocalVariableInfo &localVariableInfo(CompilerLocalVariable *variable);
6770
LLVMVariablePtr &variablePtr(Variable *variable);
6871
LLVMListPtr &listPtr(List *list);
6972

@@ -154,6 +157,8 @@ class LLVMBuildUtils
154157

155158
std::unique_ptr<LLVMCoroutine> m_coroutine;
156159

160+
std::unordered_map<CompilerLocalVariable *, LLVMLocalVariableInfo> m_localVariables;
161+
157162
std::unordered_map<Variable *, size_t> m_targetVariableMap;
158163
std::unordered_map<Variable *, LLVMVariablePtr> m_variablePtrs;
159164

src/engine/internal/llvm/llvmcodebuilder.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ CompilerValue *LLVMCodeBuilder::addLoopIndex()
159159
CompilerValue *LLVMCodeBuilder::addLocalVariableValue(CompilerLocalVariable *variable)
160160
{
161161
auto ins = std::make_shared<LLVMInstruction>(LLVMInstruction::Type::ReadLocalVariable, m_loopCondition);
162+
ins->localVarInfo = &m_utils.localVariableInfo(variable);
162163

163164
ins->args.push_back({ variable->type(), dynamic_cast<LLVMRegister *>(variable->ptr()) });
164165

@@ -425,12 +426,15 @@ CompilerLocalVariable *LLVMCodeBuilder::createLocalVariable(Compiler::StaticType
425426
CompilerValue *ptr = createOp(LLVMInstruction::Type::CreateLocalVariable, type);
426427
auto var = std::make_shared<CompilerLocalVariable>(ptr);
427428
m_localVars.push_back(var);
429+
m_utils.createLocalVariableInfo(var.get());
430+
m_instructions.last()->localVarInfo = &m_utils.localVariableInfo(var.get());
428431
return var.get();
429432
}
430433

431434
void LLVMCodeBuilder::createLocalVariableWrite(CompilerLocalVariable *variable, CompilerValue *value)
432435
{
433436
createOp(LLVMInstruction::Type::WriteLocalVariable, Compiler::StaticType::Void, variable->type(), { variable->ptr(), value });
437+
m_instructions.last()->localVarInfo = &m_utils.localVariableInfo(variable);
434438
}
435439

436440
void LLVMCodeBuilder::createVariableWrite(Variable *variable, CompilerValue *value)

src/engine/internal/llvm/llvminstruction.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
namespace libscratchcpp
1010
{
1111

12+
class LLVMLocalVariableInfo;
1213
class BlockPrototype;
1314

1415
struct LLVMInstruction
@@ -93,6 +94,7 @@ struct LLVMInstruction
9394
LLVMRegister *functionReturnReg = nullptr;
9495
bool functionTargetArg = false; // whether to add target ptr to function parameters
9596
bool functionCtxArg = false; // whether to add execution context ptr to function parameters
97+
LLVMLocalVariableInfo *localVarInfo = nullptr; // for local variables
9698
Variable *targetVariable = nullptr; // for variables
9799
List *targetList = nullptr; // for lists
98100
Compiler::StaticType targetType = Compiler::StaticType::Unknown; // variable or list type (before read/write operation)
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
3+
#pragma once
4+
5+
namespace llvm
6+
{
7+
8+
class Value;
9+
10+
}
11+
12+
namespace libscratchcpp
13+
{
14+
15+
struct LLVMLocalVariableInfo
16+
{
17+
llvm::Value *isInt = nullptr;
18+
llvm::Value *intValue = nullptr;
19+
};
20+
21+
} // namespace libscratchcpp

0 commit comments

Comments
 (0)