Skip to content

Commit ae122fc

Browse files
committed
LLVMCodeBuilder: Implement list size
1 parent 116121b commit ae122fc

File tree

6 files changed

+70
-0
lines changed

6 files changed

+70
-0
lines changed

src/dev/engine/internal/icodebuilder.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class ICodeBuilder
2424
virtual void addVariableValue(Variable *variable) = 0;
2525
virtual void addListContents(List *list) = 0;
2626
virtual void addListItem(List *list) = 0;
27+
virtual void addListSize(List *list) = 0;
2728

2829
virtual void createAdd() = 0;
2930
virtual void createSub() = 0;

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -540,6 +540,13 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
540540
break;
541541
}
542542

543+
case LLVMInstruction::Type::GetListSize: {
544+
assert(step.args.size() == 0);
545+
const LLVMListPtr &listPtr = m_listPtrs[step.workList];
546+
step.functionReturnReg->value = m_builder.CreateUIToFP(m_builder.CreateCall(resolve_list_size(), listPtr.ptr), m_builder.getDoubleTy());
547+
break;
548+
}
549+
543550
case LLVMInstruction::Type::Yield:
544551
if (!m_warp) {
545552
freeHeap();
@@ -878,6 +885,13 @@ void LLVMCodeBuilder::addListItem(List *list)
878885
m_instructions.push_back(ins);
879886
}
880887

888+
void LLVMCodeBuilder::addListSize(List *list)
889+
{
890+
LLVMInstruction &ins = createOp(LLVMInstruction::Type::GetListSize, Compiler::StaticType::Number, {}, 0);
891+
ins.workList = list;
892+
m_listPtrs[list] = LLVMListPtr();
893+
}
894+
881895
void LLVMCodeBuilder::createAdd()
882896
{
883897
createOp(LLVMInstruction::Type::Add, Compiler::StaticType::Number, Compiler::StaticType::Number, 2);
@@ -2018,6 +2032,12 @@ llvm::FunctionCallee LLVMCodeBuilder::resolve_list_get_item()
20182032
return resolveFunction("list_get_item", llvm::FunctionType::get(m_valueDataType->getPointerTo(), { listPtr, m_builder.getInt64Ty() }, false));
20192033
}
20202034

2035+
llvm::FunctionCallee LLVMCodeBuilder::resolve_list_size()
2036+
{
2037+
llvm::Type *listPtr = llvm::PointerType::get(llvm::Type::getInt8Ty(m_ctx), 0);
2038+
return resolveFunction("list_size", llvm::FunctionType::get(m_builder.getInt64Ty(), { listPtr }, false));
2039+
}
2040+
20212041
llvm::FunctionCallee LLVMCodeBuilder::resolve_strcasecmp()
20222042
{
20232043
llvm::Type *pointerType = llvm::PointerType::get(llvm::Type::getInt8Ty(m_ctx), 0);

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class LLVMCodeBuilder : public ICodeBuilder
3030
void addVariableValue(Variable *variable) override;
3131
void addListContents(List *list) override;
3232
void addListItem(List *list) override;
33+
void addListSize(List *list) override;
3334

3435
void createAdd() override;
3536
void createSub() override;
@@ -146,6 +147,7 @@ class LLVMCodeBuilder : public ICodeBuilder
146147
llvm::FunctionCallee resolve_list_append_empty();
147148
llvm::FunctionCallee resolve_list_insert_empty();
148149
llvm::FunctionCallee resolve_list_get_item();
150+
llvm::FunctionCallee resolve_list_size();
149151
llvm::FunctionCallee resolve_strcasecmp();
150152

151153
Target *m_target = nullptr;

src/dev/engine/internal/llvm/llvminstruction.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ struct LLVMInstruction
4848
InsertToList,
4949
ListReplace,
5050
GetListItem,
51+
GetListSize,
5152
Yield,
5253
BeginIf,
5354
BeginElse,

test/dev/llvm/llvmcodebuilder_test.cpp

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2259,6 +2259,51 @@ TEST_F(LLVMCodeBuilderTest, GetListItem)
22592259
ASSERT_EQ(localList->toString(), "Lorem ipsum dolor sit");
22602260
}
22612261

2262+
TEST_F(LLVMCodeBuilderTest, GetListSize)
2263+
{
2264+
EngineMock engine;
2265+
Stage stage;
2266+
Sprite sprite;
2267+
sprite.setEngine(&engine);
2268+
EXPECT_CALL(engine, stage()).WillRepeatedly(Return(&stage));
2269+
2270+
auto globalList = std::make_shared<List>("", "");
2271+
stage.addList(globalList);
2272+
2273+
auto localList = std::make_shared<List>("", "");
2274+
sprite.addList(localList);
2275+
2276+
globalList->append(1);
2277+
globalList->append(2);
2278+
globalList->append(3);
2279+
2280+
localList->append("Lorem");
2281+
localList->append("ipsum");
2282+
localList->append("dolor");
2283+
localList->append("sit");
2284+
2285+
createBuilder(&sprite, true);
2286+
2287+
m_builder->addListSize(globalList.get());
2288+
m_builder->addFunctionCall("test_print_string", Compiler::StaticType::Void, { Compiler::StaticType::String });
2289+
2290+
m_builder->addListSize(localList.get());
2291+
m_builder->addFunctionCall("test_print_string", Compiler::StaticType::Void, { Compiler::StaticType::String });
2292+
2293+
static const std::string expected =
2294+
"3\n"
2295+
"4\n";
2296+
2297+
auto code = m_builder->finalize();
2298+
auto ctx = code->createExecutionContext(&sprite);
2299+
testing::internal::CaptureStdout();
2300+
code->run(ctx.get());
2301+
ASSERT_EQ(testing::internal::GetCapturedStdout(), expected);
2302+
2303+
ASSERT_EQ(globalList->toString(), "123");
2304+
ASSERT_EQ(localList->toString(), "Lorem ipsum dolor sit");
2305+
}
2306+
22622307
TEST_F(LLVMCodeBuilderTest, Yield)
22632308
{
22642309
auto build = [this]() {

test/mocks/codebuildermock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class CodeBuilderMock : public ICodeBuilder
1414
MOCK_METHOD(void, addVariableValue, (Variable *), (override));
1515
MOCK_METHOD(void, addListContents, (List *), (override));
1616
MOCK_METHOD(void, addListItem, (List *), (override));
17+
MOCK_METHOD(void, addListSize, (List *), (override));
1718

1819
MOCK_METHOD(void, createAdd, (), (override));
1920
MOCK_METHOD(void, createSub, (), (override));

0 commit comments

Comments
 (0)