Skip to content

Commit 57574c4

Browse files
committed
LLVMCodeBuilder: Implement remove list item
1 parent c304971 commit 57574c4

File tree

6 files changed

+69
-0
lines changed

6 files changed

+69
-0
lines changed

src/dev/engine/internal/icodebuilder.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ class ICodeBuilder
5757
virtual void createVariableWrite(Variable *variable) = 0;
5858

5959
virtual void createListClear(List *list) = 0;
60+
virtual void createListRemove(List *list) = 0;
6061

6162
virtual void beginIfStatement() = 0;
6263
virtual void beginElseBranch() = 0;

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -484,6 +484,15 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
484484
break;
485485
}
486486

487+
case LLVMInstruction::Type::RemoveListItem: {
488+
assert(step.args.size() == 1);
489+
const auto &arg = step.args[0];
490+
const LLVMListPtr &listPtr = m_listPtrs[step.workList];
491+
llvm::Value *index = m_builder.CreateFPToUI(castValue(arg.second, arg.first), m_builder.getInt64Ty());
492+
m_builder.CreateCall(resolve_list_remove(), { listPtr.ptr, index });
493+
break;
494+
}
495+
487496
case LLVMInstruction::Type::Yield:
488497
if (!m_warp) {
489498
freeHeap();
@@ -946,6 +955,13 @@ void LLVMCodeBuilder::createListClear(List *list)
946955
m_listPtrs[list] = LLVMListPtr();
947956
}
948957

958+
void LLVMCodeBuilder::createListRemove(List *list)
959+
{
960+
LLVMInstruction &ins = createOp(LLVMInstruction::Type::RemoveListItem, Compiler::StaticType::Void, Compiler::StaticType::Number, 1);
961+
ins.workList = list;
962+
m_listPtrs[list] = LLVMListPtr();
963+
}
964+
949965
void LLVMCodeBuilder::beginIfStatement()
950966
{
951967
LLVMInstruction ins(LLVMInstruction::Type::BeginIf);
@@ -1842,6 +1858,12 @@ llvm::FunctionCallee LLVMCodeBuilder::resolve_list_clear()
18421858
return resolveFunction("list_clear", llvm::FunctionType::get(m_builder.getInt1Ty(), { listPtr }, false));
18431859
}
18441860

1861+
llvm::FunctionCallee LLVMCodeBuilder::resolve_list_remove()
1862+
{
1863+
llvm::Type *listPtr = llvm::PointerType::get(llvm::Type::getInt8Ty(m_ctx), 0);
1864+
return resolveFunction("list_remove", llvm::FunctionType::get(m_builder.getInt1Ty(), { listPtr, m_builder.getInt64Ty() }, false));
1865+
}
1866+
18451867
llvm::FunctionCallee LLVMCodeBuilder::resolve_strcasecmp()
18461868
{
18471869
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
@@ -63,6 +63,7 @@ class LLVMCodeBuilder : public ICodeBuilder
6363
void createVariableWrite(Variable *variable) override;
6464

6565
void createListClear(List *list) override;
66+
void createListRemove(List *list) override;
6667

6768
void beginIfStatement() override;
6869
void beginElseBranch() override;
@@ -135,6 +136,7 @@ class LLVMCodeBuilder : public ICodeBuilder
135136
llvm::FunctionCallee resolve_value_greater();
136137
llvm::FunctionCallee resolve_value_lower();
137138
llvm::FunctionCallee resolve_list_clear();
139+
llvm::FunctionCallee resolve_list_remove();
138140
llvm::FunctionCallee resolve_strcasecmp();
139141

140142
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
@@ -43,6 +43,7 @@ struct LLVMInstruction
4343
WriteVariable,
4444
ReadVariable,
4545
ClearList,
46+
RemoveListItem,
4647
Yield,
4748
BeginIf,
4849
BeginElse,

test/dev/llvm/llvmcodebuilder_test.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1974,6 +1974,48 @@ TEST_F(LLVMCodeBuilderTest, ClearList)
19741974
ASSERT_EQ(localList3->toString(), strings[localList3.get()]);
19751975
}
19761976

1977+
TEST_F(LLVMCodeBuilderTest, RemoveFromList)
1978+
{
1979+
EngineMock engine;
1980+
Stage stage;
1981+
Sprite sprite;
1982+
sprite.setEngine(&engine);
1983+
EXPECT_CALL(engine, stage()).WillRepeatedly(Return(&stage));
1984+
1985+
std::unordered_map<List *, std::string> strings;
1986+
1987+
auto globalList = std::make_shared<List>("", "");
1988+
stage.addList(globalList);
1989+
1990+
auto localList = std::make_shared<List>("", "");
1991+
sprite.addList(localList);
1992+
1993+
globalList->append(1);
1994+
globalList->append(2);
1995+
globalList->append(3);
1996+
1997+
localList->append("Lorem");
1998+
localList->append("ipsum");
1999+
localList->append("dolor");
2000+
localList->append("sit");
2001+
strings[localList.get()] = localList->toString();
2002+
2003+
createBuilder(&sprite, true);
2004+
2005+
m_builder->addConstValue(1);
2006+
m_builder->createListRemove(globalList.get());
2007+
2008+
m_builder->addConstValue(3);
2009+
m_builder->createListRemove(localList.get());
2010+
2011+
auto code = m_builder->finalize();
2012+
auto ctx = code->createExecutionContext(&sprite);
2013+
code->run(ctx.get());
2014+
2015+
ASSERT_EQ(globalList->toString(), "13");
2016+
ASSERT_EQ(localList->toString(), "Lorem ipsum dolor");
2017+
}
2018+
19772019
TEST_F(LLVMCodeBuilderTest, Yield)
19782020
{
19792021
auto build = [this]() {

test/mocks/codebuildermock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ class CodeBuilderMock : public ICodeBuilder
4747
MOCK_METHOD(void, createVariableWrite, (Variable *), (override));
4848

4949
MOCK_METHOD(void, createListClear, (List *), (override));
50+
MOCK_METHOD(void, createListRemove, (List *), (override));
5051

5152
MOCK_METHOD(void, beginIfStatement, (), (override));
5253
MOCK_METHOD(void, beginElseBranch, (), (override));

0 commit comments

Comments
 (0)