Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
2
2025ustc-jianmu-compiler
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
1
Issues
1
List
Boards
Labels
Service Desk
Milestones
Merge Requests
43
Merge Requests
43
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
compiler_staff
2025ustc-jianmu-compiler
Commits
606023f0
Commit
606023f0
authored
Nov 25, 2025
by
Yang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
remove basicblock ilist
parent
aa8e7d9f
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
43 additions
and
33 deletions
+43
-33
CMakeLists.txt
CMakeLists.txt
+4
-0
include/codegen/CodeGen.hpp
include/codegen/CodeGen.hpp
+1
-0
include/lightir/BasicBlock.hpp
include/lightir/BasicBlock.hpp
+1
-1
include/lightir/Function.hpp
include/lightir/Function.hpp
+4
-3
include/lightir/Type.hpp
include/lightir/Type.hpp
+7
-1
src/codegen/CodeGen.cpp
src/codegen/CodeGen.cpp
+5
-5
src/lightir/Function.cpp
src/lightir/Function.cpp
+21
-23
No files found.
CMakeLists.txt
View file @
606023f0
...
...
@@ -9,6 +9,10 @@ SET(CMAKE_CXX_FLAGS_ASAN "${CMAKE_CXX_FLAGS_DEBUG} -fsanitize=undefined -fsaniti
set
(
default_build_type
"Debug"
)
if
(
CMAKE_BUILD_TYPE STREQUAL
"Debug"
)
add_definitions
(
-DDEBUG_BUILD
)
endif
()
if
(
NOT
(
CMAKE_BUILD_TYPE_SHADOW STREQUAL CMAKE_BUILD_TYPE
))
if
(
NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES
)
message
(
STATUS
"Setting build type to '
${
default_build_type
}
'"
)
...
...
include/codegen/CodeGen.hpp
View file @
606023f0
...
...
@@ -3,6 +3,7 @@
#include "ASMInstruction.hpp"
#include "Module.hpp"
#include "Register.hpp"
#include <unordered_map>
class
CodeGen
{
public:
...
...
include/lightir/BasicBlock.hpp
View file @
606023f0
...
...
@@ -13,7 +13,7 @@ class Function;
class
Instruction
;
class
Module
;
class
BasicBlock
:
public
Value
,
public
llvm
::
ilist_node
<
BasicBlock
>
{
class
BasicBlock
:
public
Value
{
public:
~
BasicBlock
()
=
default
;
static
BasicBlock
*
create
(
Module
*
m
,
const
std
::
string
&
name
,
...
...
include/lightir/Function.hpp
View file @
606023f0
...
...
@@ -36,10 +36,11 @@ class Function : public Value, public llvm::ilist_node<Function> {
Module
*
get_parent
()
const
;
// 此处 remove 的 BasicBlock, 需要手动 delete
void
remove
(
BasicBlock
*
bb
);
BasicBlock
*
get_entry_block
()
{
return
&*
basic_blocks_
.
begin
();
}
BasicBlock
*
get_entry_block
()
{
return
basic_blocks_
.
front
();
}
llvm
::
ilist
<
BasicBlock
>
&
get_basic_blocks
()
{
return
basic_blocks_
;
}
std
::
list
<
BasicBlock
*
>
&
get_basic_blocks
()
{
return
basic_blocks_
;
}
std
::
list
<
Argument
>
&
get_args
()
{
return
arguments_
;
}
bool
is_declaration
()
{
return
basic_blocks_
.
empty
();
}
...
...
@@ -50,7 +51,7 @@ class Function : public Value, public llvm::ilist_node<Function> {
void
check_for_block_relation_error
();
private:
llvm
::
ilist
<
BasicBlock
>
basic_blocks_
;
std
::
list
<
BasicBlock
*
>
basic_blocks_
;
std
::
list
<
Argument
>
arguments_
;
Module
*
parent_
;
unsigned
seq_cnt_
;
// print use
...
...
include/lightir/Type.hpp
View file @
606023f0
...
...
@@ -23,7 +23,13 @@ class Type {
};
explicit
Type
(
TypeID
tid
,
Module
*
m
);
~
Type
()
=
default
;
// 生成 vptr, 使调试时能够显示 IntegerType 等 Type 的信息
#ifdef DEBUG_BUILD
virtual
#endif
~
Type
()
=
default
;
TypeID
get_type_id
()
const
{
return
tid_
;
}
...
...
src/codegen/CodeGen.cpp
View file @
606023f0
...
...
@@ -14,8 +14,8 @@ void CodeGen::allocate() {
}
// 为指令结果分配栈空间
for
(
auto
&
bb
:
context
.
func
->
get_basic_blocks
())
{
for
(
auto
&
instr
:
bb
.
get_instructions
())
{
for
(
auto
bb
:
context
.
func
->
get_basic_blocks
())
{
for
(
auto
&
instr
:
bb
->
get_instructions
())
{
// 每个非 void 的定值都分配栈空间
if
(
not
instr
.
is_void
())
{
auto
size
=
instr
.
get_type
()
->
get_size
();
...
...
@@ -407,10 +407,10 @@ void CodeGen::run() {
// 生成 prologue
gen_prologue
();
for
(
auto
&
bb
:
func
.
get_basic_blocks
())
{
context
.
bb
=
&
bb
;
for
(
auto
bb
:
func
.
get_basic_blocks
())
{
context
.
bb
=
bb
;
append_inst
(
label_name
(
context
.
bb
),
ASMInstruction
::
Label
);
for
(
auto
&
instr
:
bb
.
get_instructions
())
{
for
(
auto
&
instr
:
bb
->
get_instructions
())
{
// For debug
append_inst
(
instr
.
print
(),
ASMInstruction
::
Comment
);
context
.
inst
=
&
instr
;
// 更新 context
...
...
src/lightir/Function.cpp
View file @
606023f0
...
...
@@ -58,8 +58,7 @@ void Function::set_instr_name() {
}
}
}
for
(
auto
&
bb1
:
basic_blocks_
)
{
auto
bb
=
&
bb1
;
for
(
auto
bb
:
basic_blocks_
)
{
if
(
seq
.
find
(
bb
)
==
seq
.
end
())
{
auto
seq_num
=
seq
.
size
()
+
seq_cnt_
;
if
(
bb
->
set_name
(
"label"
+
std
::
to_string
(
seq_num
)))
{
...
...
@@ -116,8 +115,7 @@ std::string Function::print() {
}
else
{
func_ir
+=
" {"
;
func_ir
+=
"
\n
"
;
for
(
auto
&
bb1
:
this
->
get_basic_blocks
())
{
auto
bb
=
&
bb1
;
for
(
auto
&
bb
:
this
->
get_basic_blocks
())
{
func_ir
+=
bb
->
print
();
}
func_ir
+=
"}"
;
...
...
@@ -139,18 +137,18 @@ void Function::check_for_block_relation_error()
{
// 检查函数的基本块表是否包含所有且仅包含 get_parent 是本函数的基本块
std
::
unordered_set
<
BasicBlock
*>
bbs
;
for
(
auto
&
bb
:
basic_blocks_
)
for
(
auto
bb
:
basic_blocks_
)
{
bbs
.
emplace
(
&
bb
);
bbs
.
emplace
(
bb
);
}
for
(
auto
&
bb
:
basic_blocks_
)
for
(
auto
bb
:
basic_blocks_
)
{
assert
((
bb
.
get_parent
()
==
this
)
&&
"函数 F 的基本块表中包含基本块 a, 但 a 的 get_parent 方法不返回 F"
);
for
(
auto
i
:
bb
.
get_succ_basic_blocks
())
assert
((
bb
->
get_parent
()
==
this
)
&&
"函数 F 的基本块表中包含基本块 a, 但 a 的 get_parent 方法不返回 F"
);
for
(
auto
i
:
bb
->
get_succ_basic_blocks
())
{
assert
((
bbs
.
count
(
i
))
&&
"函数 F 的基本块表中包含基本块 a, a 的后继块表中的某基本块 b 不在 F 的基本块表中"
);
}
for
(
auto
i
:
bb
.
get_pre_basic_blocks
())
for
(
auto
i
:
bb
->
get_pre_basic_blocks
())
{
assert
((
bbs
.
count
(
i
))
&&
"函数 F 的基本块表中包含基本块 a, a 的前驱块表中的某基本块 b 不在 F 的基本块表中"
);
}
...
...
@@ -171,22 +169,22 @@ void Function::check_for_block_relation_error()
}
*/
// 检查基本块基本信息
for
(
auto
&
bb
:
basic_blocks_
)
for
(
auto
bb
:
basic_blocks_
)
{
assert
((
!
bb
.
get_instructions
().
empty
())
&&
"发现了空基本块"
);
auto
b
=
&
bb
.
get_instructions
().
back
();
assert
((
!
bb
->
get_instructions
().
empty
())
&&
"发现了空基本块"
);
auto
b
=
&
bb
->
get_instructions
().
back
();
assert
((
b
->
is_br
()
||
b
->
is_ret
())
&&
"发现了无 terminator 基本块"
);
assert
((
b
->
is_br
()
||
bb
.
get_succ_basic_blocks
().
empty
())
&&
"某基本块末尾是 ret 指令但是后继块表不是空的, 或者末尾是 br 但后继表为空"
);
assert
((
b
->
is_br
()
||
bb
->
get_succ_basic_blocks
().
empty
())
&&
"某基本块末尾是 ret 指令但是后继块表不是空的, 或者末尾是 br 但后继表为空"
);
}
// 检查基本块前驱后继关系是否是与 branch 指令对应
for
(
auto
&
bb
:
basic_blocks_
)
for
(
auto
bb
:
basic_blocks_
)
{
if
(
!
bb
.
get_succ_basic_blocks
().
empty
()){
if
(
!
bb
->
get_succ_basic_blocks
().
empty
()){
std
::
unordered_set
<
BasicBlock
*>
suc_table
;
std
::
unordered_set
<
BasicBlock
*>
br_get
;
for
(
auto
suc
:
bb
.
get_succ_basic_blocks
())
for
(
auto
suc
:
bb
->
get_succ_basic_blocks
())
suc_table
.
emplace
(
suc
);
auto
&
ops
=
bb
.
get_instructions
().
back
().
get_operands
();
auto
&
ops
=
bb
->
get_instructions
().
back
().
get_operands
();
for
(
auto
i
:
ops
)
{
auto
bb2
=
dynamic_cast
<
BasicBlock
*>
(
i
);
...
...
@@ -199,7 +197,7 @@ void Function::check_for_block_relation_error()
for
(
auto
i
:
suc_table
)
{
bool
ok
=
false
;
for
(
auto
j
:
i
->
get_pre_basic_blocks
())
{
if
(
j
==
&
bb
){
if
(
j
==
bb
){
ok
=
true
;
break
;
}
...
...
@@ -211,12 +209,12 @@ void Function::check_for_block_relation_error()
// 检查基本块前驱后继关系是否是与 branch 指令对应
for
(
auto
&
bb
:
basic_blocks_
)
{
for
(
auto
pre
:
bb
.
get_pre_basic_blocks
())
for
(
auto
pre
:
bb
->
get_pre_basic_blocks
())
{
bool
ok
=
false
;
for
(
auto
i
:
pre
->
get_succ_basic_blocks
())
{
if
(
i
==
&
bb
)
if
(
i
==
bb
)
{
ok
=
true
;
break
;
...
...
@@ -229,9 +227,9 @@ void Function::check_for_block_relation_error()
// 检查指令 parent 设置
for
(
auto
&
bb
:
basic_blocks_
)
{
for
(
auto
&
inst
:
bb
.
get_instructions
())
for
(
auto
&
inst
:
bb
->
get_instructions
())
{
assert
((
inst
.
get_parent
()
==
&
bb
)
&&
"基本块 A 指令表包含指令 b, 但是 b 的 get_parent 函数不返回 A"
);
assert
((
inst
.
get_parent
()
==
bb
)
&&
"基本块 A 指令表包含指令 b, 但是 b 的 get_parent 函数不返回 A"
);
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment