Skip to content

Commit 53cebe5

Browse files
committed
wip
1 parent 6e723ca commit 53cebe5

File tree

8 files changed

+87
-79
lines changed

8 files changed

+87
-79
lines changed

compiler/plc_ast/src/ast.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,9 @@ pub enum LinkageType {
327327
/// This indicates an element that should not have any declarations within the compiled project
328328
/// For example a built in function is implied to exist but not declared
329329
BuiltIn,
330+
// TODO: A private linkage indicates an internal element that should not be visible externally
331+
// This is for example a static constructor that should not leak outside its module
332+
// Private,
330333
}
331334

332335
#[derive(Debug, PartialEq, Eq, Clone, Copy)]

compiler/plc_diagnostics/src/diagnostics.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -303,8 +303,7 @@ impl Diagnostic {
303303

304304
pub fn cannot_generate_call_statement(operator: &AstNode) -> Diagnostic {
305305
//TODO: We could probably get a better slice here
306-
panic!("{operator:?}");
307-
// Diagnostic::codegen_error(format!("cannot generate call statement for {:?}", operator), operator)
306+
Diagnostic::codegen_error(format!("cannot generate call statement for {:?}", operator), operator)
308307
}
309308

310309
pub fn cannot_generate_from_empty_literal<T>(type_name: &str, location: T) -> Diagnostic

src/codegen/tests/initialization_test/complex_initializers.rs

Lines changed: 9 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3333,15 +3333,15 @@ fn user_init_called_when_declared_as_external() {
33333333
target datalayout = "[filtered]"
33343334
target triple = "[filtered]"
33353335
3336-
%prog = type { %foo }
3337-
%foo = type { i32*, i16, i16 }
33383336
%__vtable_foo = type { void (%foo*)*, void (%foo*)* }
3337+
%foo = type { i32*, i16, i16 }
3338+
%prog = type { %foo }
33393339
3340+
@__vtable_foo_instance = external global %__vtable_foo
33403341
@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @__init___Test, i8* null }]
33413342
@prog_instance = global %prog zeroinitializer
33423343
@__foo__init = external unnamed_addr constant %foo
33433344
@____vtable_foo__init = unnamed_addr constant %__vtable_foo zeroinitializer
3344-
@__vtable_foo_instance = global %__vtable_foo zeroinitializer
33453345
33463346
declare void @foo(%foo*)
33473347
@@ -3354,26 +3354,18 @@ fn user_init_called_when_declared_as_external() {
33543354
ret void
33553355
}
33563356
3357-
define void @__init___vtable_foo(%__vtable_foo* %0) {
3358-
entry:
3359-
%self = alloca %__vtable_foo*, align 8
3360-
store %__vtable_foo* %0, %__vtable_foo** %self, align 8
3361-
%deref = load %__vtable_foo*, %__vtable_foo** %self, align 8
3362-
%__body = getelementptr inbounds %__vtable_foo, %__vtable_foo* %deref, i32 0, i32 0
3363-
store void (%foo*)* @foo, void (%foo*)** %__body, align 8
3364-
%deref1 = load %__vtable_foo*, %__vtable_foo** %self, align 8
3365-
%FB_INIT = getelementptr inbounds %__vtable_foo, %__vtable_foo* %deref1, i32 0, i32 1
3366-
store void (%foo*)* @foo__FB_INIT, void (%foo*)** %FB_INIT, align 8
3367-
ret void
3368-
}
3369-
33703357
define void @__init_prog(%prog* %0) {
33713358
entry:
33723359
%self = alloca %prog*, align 8
33733360
store %prog* %0, %prog** %self, align 8
3361+
%deref = load %prog*, %prog** %self, align 8
3362+
%f = getelementptr inbounds %prog, %prog* %deref, i32 0, i32 0
3363+
call void @__init_foo(%foo* %f)
33743364
ret void
33753365
}
33763366
3367+
declare void @__init_foo(%foo*)
3368+
33773369
define void @__user_init_prog(%prog* %0) {
33783370
entry:
33793371
%self = alloca %prog*, align 8
@@ -3384,28 +3376,12 @@ fn user_init_called_when_declared_as_external() {
33843376
ret void
33853377
}
33863378
3387-
define void @__user_init_foo(%foo* %0) {
3388-
entry:
3389-
%self = alloca %foo*, align 8
3390-
store %foo* %0, %foo** %self, align 8
3391-
%deref = load %foo*, %foo** %self, align 8
3392-
call void @foo__FB_INIT(%foo* %deref)
3393-
ret void
3394-
}
3395-
3396-
define void @__user_init___vtable_foo(%__vtable_foo* %0) {
3397-
entry:
3398-
%self = alloca %__vtable_foo*, align 8
3399-
store %__vtable_foo* %0, %__vtable_foo** %self, align 8
3400-
ret void
3401-
}
3379+
declare void @__user_init_foo(%foo*)
34023380
34033381
define void @__init___Test() {
34043382
entry:
34053383
call void @__init_prog(%prog* @prog_instance)
3406-
call void @__init___vtable_foo(%__vtable_foo* @__vtable_foo_instance)
34073384
call void @__user_init_prog(%prog* @prog_instance)
3408-
call void @__user_init___vtable_foo(%__vtable_foo* @__vtable_foo_instance)
34093385
ret void
34103386
}
34113387
"#);

src/index/tests/index_tests.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1833,6 +1833,7 @@ fn aliased_hardware_access_variable_creates_global_var_for_address() {
18331833
"<internal>",
18341834
),
18351835
},
1836+
linkage: Internal,
18361837
},
18371838
)
18381839
"#);
@@ -1903,6 +1904,7 @@ fn aliased_hardware_access_variable_is_indexed_as_a_pointer() {
19031904
"<internal>",
19041905
),
19051906
},
1907+
linkage: Internal,
19061908
},
19071909
)
19081910
"#);

src/lowering.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ impl InitVisitor {
5454
unresolved_initializers: Vec<UnresolvableConstant>,
5555
id_provider: IdProvider,
5656
) -> Self {
57-
let unresolved_initializers = dbg!(Initializers::new(&unresolved_initializers, &index));
57+
let unresolved_initializers = Initializers::new(&unresolved_initializers, &index);
5858
Self {
5959
index,
6060
unresolved_initializers,
@@ -75,19 +75,18 @@ impl InitVisitor {
7575

7676
fn collect_user_init_candidates(&mut self, unit: &mut CompilationUnit) {
7777
// collect all candidates for user-defined init functions
78-
for pou in unit.pous.iter().filter(|it| matches!(it.kind, PouType::FunctionBlock | PouType::Program))
78+
for pou in unit.pous.iter().filter(|it| matches!(it.kind, PouType::FunctionBlock | PouType::Program)).filter(|it| !matches!(it.linkage, LinkageType::BuiltIn))
7979
{
8080
// add the POU to potential `FB_INIT` candidates
8181
self.user_inits
8282
.insert(pou.name.to_owned(), self.index.find_method(&pou.name, "FB_INIT").is_some());
8383
}
8484

8585
for user_type in
86-
unit.user_types.iter_mut().filter(|it| matches!(it.data_type, DataType::StructType { .. }))
86+
unit.user_types.iter_mut().filter(|it| matches!(it.data_type, DataType::StructType { .. })).filter(|it| !matches!(it.linkage, LinkageType::BuiltIn))
8787
{
8888
// add the struct to potential `STRUCT_INIT` candidates
8989
if let Some(name) = user_type.data_type.get_name() {
90-
eprintln!("insert user init for {name}");
9190
self.user_inits.insert(name.to_string(), false);
9291
};
9392
}
@@ -357,8 +356,8 @@ impl AstVisitorMut for InitVisitor {
357356
fn visit_user_type_declaration(&mut self, user_type: &mut plc_ast::ast::UserTypeDeclaration) {
358357
if !matches!(user_type.linkage, LinkageType::BuiltIn) {
359358
self.update_struct_initializers(user_type);
359+
user_type.walk(self);
360360
}
361-
user_type.walk(self);
362361
}
363362

364363
fn visit_data_type(&mut self, data_type: &mut DataType) {

src/lowering/initializers.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ impl<'lwr> Init<'lwr> for Initializers {
5959
}
6060
})
6161
.filter(|(scope, _)| {
62-
dbg!(index.find_type(dbg!(scope)))
62+
index.find_type(scope)
6363
.is_some_and(|it| !matches!(it.linkage, LinkageType::BuiltIn))
6464
})
6565
.for_each(|(scope, data)| {
@@ -342,7 +342,7 @@ fn create_init_wrapper_function(
342342
let global_instances = if let Some(global_instances) =
343343
lowerer.unresolved_initializers.get(GLOBAL_SCOPE).map(|it| {
344344
it.keys().filter_map(|var_name| {
345-
lowerer.index.find_variable(None, &[var_name]).and_then(|it| {
345+
lowerer.index.find_variable(None, &[var_name]).filter(|it| !it.is_external()).and_then(|it| {
346346
lowerer.index.find_effective_type_by_name(it.get_type_name()).and_then(|dt| {
347347
let name = dt.get_type_information().get_name();
348348
if dt.get_type_information().is_struct() {

src/resolver/tests/fnptr.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,7 @@ fn function_pointer_arguments_have_correct_type_hint() {
535535
location: SourceLocation {
536536
span: None,
537537
},
538+
linkage: Internal,
538539
},
539540
)
540541
"#);

0 commit comments

Comments
 (0)