Skip to content

Commit 47ed947

Browse files
committed
AST cleanups and extend codegen
1 parent 112af66 commit 47ed947

File tree

12 files changed

+142
-38
lines changed

12 files changed

+142
-38
lines changed

CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ message(STATUS "Using LLVM in: ${LLVM_DIR}")
77
set (CMAKE_CXX_STANDARD 20)
88
set (CMAKE_CXX_EXTENSIONS OFF)
99

10+
#add_compile_options(-fsanitize=address)
11+
#add_link_options(-fsanitize=address)
12+
1013
include(CheckTypeSize)
1114

1215
check_type_size("__int128" SIZEOF_INT128)

code/ast/Item.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,6 @@ void Item::setOuterAttributes(std::span<OuterAttribute> outer) {
1111
outerAttributes = {outer.begin(), outer.end()};
1212
}
1313

14-
void Item::setVisItem(std::shared_ptr<VisItem> _visItem) { visItem = _visItem; }
15-
16-
std::shared_ptr<VisItem> Item::getVisItem() const { return visItem; }
17-
1814
std::span<OuterAttribute> Item::getOuterAttributes() {
1915
return outerAttributes;
2016
}

code/crate_builder/CrateBuilder.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ namespace rust_compiler::crate_builder {
2121
void CrateBuilder::emitCrate(rust_compiler::ast::Crate *crate) {
2222

2323
for (auto &i : crate->getItems()) {
24-
emitItem(i);
24+
emitItem(i.get());
2525
}
2626
}
2727

code/crate_builder/Function.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@ using namespace rust_compiler::adt;
1616
namespace rust_compiler::crate_builder {
1717

1818
mlir::FunctionType CrateBuilder::getFunctionType(ast::Function *fun) {
19-
assert(false);
20-
2119
llvm::SmallVector<mlir::Type> parameterType;
2220
FunctionParameters params = fun->getParams();
2321
std::vector<FunctionParam> parms = params.getParams();
@@ -49,13 +47,13 @@ mlir::FunctionType CrateBuilder::getFunctionType(ast::Function *fun) {
4947
}
5048

5149
/// FIXME set visibility: { sym_visibility = "public" }
52-
void CrateBuilder::emitFunction(std::shared_ptr<ast::Function> f) {
50+
void CrateBuilder::emitFunction(ast::Function* f) {
5351

5452
ScopedHashTableScope<std::string, mlir::Value> scope(symbolTable);
5553

5654
builder.setInsertionPointToEnd(theModule.getBody());
5755

58-
mlir::FunctionType funType = getFunctionType(f.get());
56+
mlir::FunctionType funType = getFunctionType(f);
5957

6058
mlir::func::FuncOp fun = builder.create<mlir::func::FuncOp>(
6159
getLocation(f->getLocation()), "foo", funType);

code/crate_builder/Item.cpp

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#include "AST/Item.h"
2+
13
#include "AST/Module.h"
24
#include "AST/VisItem.h"
35
#include "CrateBuilder/CrateBuilder.h"
@@ -8,16 +10,23 @@ using namespace rust_compiler::ast;
810

911
namespace rust_compiler::crate_builder {
1012

11-
void CrateBuilder::emitItem(std::shared_ptr<Item> &item) {
12-
13-
emitVisItem(item->getVisItem());
13+
void CrateBuilder::emitItem(Item *item) {
14+
switch (item->getItemKind()) {
15+
case ItemKind::VisItem: {
16+
emitVisItem(static_cast<VisItem *>(item));
17+
break;
18+
}
19+
case ItemKind::MacroItem: {
20+
assert(false && "to be implemented");
21+
}
22+
}
1423
}
1524

16-
void CrateBuilder::emitVisItem(std::shared_ptr<VisItem> visItem) {
25+
void CrateBuilder::emitVisItem(VisItem *visItem) {
1726

1827
switch (visItem->getKind()) {
1928
case VisItemKind::Module: {
20-
emitModule(std::static_pointer_cast<ast::Module>(visItem));
29+
emitModule(static_cast<ast::Module *>(visItem));
2130
break;
2231
}
2332
case VisItemKind::ExternCrate: {
@@ -27,7 +36,7 @@ void CrateBuilder::emitVisItem(std::shared_ptr<VisItem> visItem) {
2736
break;
2837
}
2938
case VisItemKind::Function: {
30-
emitFunction(std::static_pointer_cast<ast::Function>(visItem));
39+
emitFunction(static_cast<ast::Function *>(visItem));
3140
break;
3241
}
3342
case VisItemKind::TypeAlias: {

code/crate_builder/Module.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,9 @@
44

55
namespace rust_compiler::crate_builder {
66

7-
void CrateBuilder::emitModule(std::shared_ptr<ast::Module> module) {
8-
9-
for (auto &mod : module->getItems()) {
10-
emitItem(mod);
11-
}
7+
void CrateBuilder::emitModule(ast::Module *module) {
8+
for (auto &mod : module->getItems())
9+
emitItem(mod.get());
1210
}
1311

1412
} // namespace rust_compiler::crate_builder

code/crate_builder/Types.cpp

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,79 @@
1+
#include "AST/Types/TypeExpression.h"
2+
#include "AST/Types/TypeNoBounds.h"
13
#include "CrateBuilder/CrateBuilder.h"
24

5+
using namespace rust_compiler::ast::types;
6+
37
namespace rust_compiler::crate_builder {
48

5-
mlir::Type CrateBuilder::getType(ast::types::TypeExpression *) {
9+
mlir::Type CrateBuilder::getType(ast::types::TypeExpression *type) {
10+
switch (type->getKind()) {
11+
case TypeExpressionKind::TypeNoBounds: {
12+
assert(false && "to be implemented");
13+
}
14+
case TypeExpressionKind::ImplTraitType: {
15+
assert(false && "to be implemented");
16+
}
17+
case TypeExpressionKind::TraitObjectType: {
18+
return getTypeNoBounds(static_cast<TypeNoBounds *>(type));
19+
}
20+
}
21+
}
22+
23+
mlir::Type CrateBuilder::getTypeNoBounds(ast::types::TypeNoBounds *noBounds) {
24+
assert(false);
25+
switch (noBounds->getKind()) {
26+
case TypeNoBoundsKind::ParenthesizedType: {
27+
assert(false && "to be implemented");
28+
}
29+
case TypeNoBoundsKind::ImplTraitType: {
30+
assert(false && "to be implemented");
31+
}
32+
case TypeNoBoundsKind::ImplTraitTypeOneBound: {
33+
assert(false && "to be implemented");
34+
}
35+
case TypeNoBoundsKind::TraitObjectTypeOneBound: {
36+
assert(false && "to be implemented");
37+
}
38+
case TypeNoBoundsKind::TypePath: {
39+
return getTypePath(static_cast<TypePath *>(noBounds));
40+
assert(false && "to be implemented");
41+
}
42+
case TypeNoBoundsKind::TupleType: {
43+
assert(false && "to be implemented");
44+
}
45+
case TypeNoBoundsKind::NeverType: {
46+
assert(false && "to be implemented");
47+
}
48+
case TypeNoBoundsKind::RawPointerType: {
49+
assert(false && "to be implemented");
50+
}
51+
case TypeNoBoundsKind::ReferenceType: {
52+
assert(false && "to be implemented");
53+
}
54+
case TypeNoBoundsKind::ArrayType: {
55+
assert(false && "to be implemented");
56+
}
57+
case TypeNoBoundsKind::SliceType: {
58+
assert(false && "to be implemented");
59+
}
60+
case TypeNoBoundsKind::InferredType: {
61+
assert(false && "to be implemented");
62+
}
63+
case TypeNoBoundsKind::QualifiedPathInType: {
64+
assert(false && "to be implemented");
65+
}
66+
case TypeNoBoundsKind::BareFunctionType: {
67+
assert(false && "to be implemented");
68+
}
69+
case TypeNoBoundsKind::MacroInvocation: {
70+
assert(false && "to be implemented");
71+
}
72+
}
73+
assert(false);
74+
}
75+
76+
mlir::Type CrateBuilder::getTypePath(ast::types::TypePath *path) {
677
assert(false);
778
}
879

code/include/AST/Item.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,10 @@ class Item : public Node {
2424
explicit Item(Location loc, ItemKind kind) : Node(loc), kind(kind) {}
2525

2626
void setOuterAttributes(std::span<OuterAttribute> outer);
27-
void setVisItem(std::shared_ptr<VisItem> visItem);
2827

2928
std::span<OuterAttribute> getOuterAttributes() ;
3029

3130
ItemKind getItemKind() const { return kind; }
32-
std::shared_ptr<VisItem> getVisItem() const;
3331
};
3432

3533
} // namespace rust_compiler::ast

code/include/CrateBuilder/CrateBuilder.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,12 @@
1313
#include "AST/MethodCallExpression.h"
1414
#include "AST/OperatorExpression.h"
1515
#include "AST/Types/TypeExpression.h"
16+
#include "AST/Types/TypeNoBounds.h"
1617
#include "AST/VariableDeclaration.h"
1718
#include "CrateBuilder/Target.h"
1819
#include "Hir/HirDialect.h"
1920
#include "AST/ReturnExpression.h"
21+
#include "AST/Types/TypePath.h"
2022

2123
#include <llvm/MC/TargetRegistry.h>
2224
#include <llvm/Remarks/YAMLRemarkSerializer.h>
@@ -99,10 +101,10 @@ class CrateBuilder {
99101
mlir::ModuleOp getModule() const { return theModule; };
100102

101103
private:
102-
void emitItem(std::shared_ptr<ast::Item> &);
103-
void emitVisItem(std::shared_ptr<ast::VisItem>);
104-
void emitFunction(std::shared_ptr<ast::Function>);
105-
void emitModule(std::shared_ptr<ast::Module>);
104+
void emitItem(ast::Item *item);
105+
void emitVisItem(ast::VisItem *vis);
106+
void emitFunction(ast::Function *fun);
107+
void emitModule(ast::Module*);
106108
std::optional<mlir::Value> emitBlockExpression(ast::BlockExpression *);
107109
std::optional<mlir::Value> emitStatements(ast::Statements);
108110
mlir::Value emitExpression(ast::Expression* expr);
@@ -126,6 +128,8 @@ class CrateBuilder {
126128
mlir::FunctionType getFunctionType(ast::Function *);
127129

128130
mlir::Type getType(ast::types::TypeExpression *);
131+
mlir::Type getTypeNoBounds(ast::types::TypeNoBounds *);
132+
mlir::Type getTypePath(ast::types::TypePath *);
129133

130134
/// Helper conversion for a Rust AST location to an MLIR location.
131135
mlir::Location getLocation(const Location &loc) {

code/sema/Item.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#include "AST/Module.h"
22
#include "Sema/Sema.h"
33

4+
#include <memory>
5+
46
using namespace rust_compiler::ast;
57

68
namespace rust_compiler::sema {
@@ -9,7 +11,15 @@ void Sema::walkItem(std::shared_ptr<ast::Item> item) {
911

1012
walkOuterAttributes(item->getOuterAttributes());
1113

12-
walkVisItem(item->getVisItem());
14+
switch (item->getItemKind()) {
15+
case ItemKind::VisItem: {
16+
walkVisItem(std::static_pointer_cast<VisItem>(item));
17+
break;
18+
}
19+
case ItemKind::MacroItem: {
20+
break;
21+
}
22+
}
1323
}
1424

1525
void Sema::analyzeItemDeclaration(std::shared_ptr<ast::Node> item) {

0 commit comments

Comments
 (0)