Skip to content

Commit 735e873

Browse files
committed
codegen: Propagate errors better when creating section names
1 parent 7ad554f commit 735e873

File tree

3 files changed

+22
-16
lines changed

3 files changed

+22
-16
lines changed

src/codegen/generators/pou_generator.rs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -153,33 +153,37 @@ impl<'ink, 'cg> PouGenerator<'ink, 'cg> {
153153
PouGenerator { llvm, index, annotations, llvm_index }
154154
}
155155

156-
fn mangle_function(&self, implementation: &ImplementationIndexEntry) -> String {
156+
fn mangle_function(&self, implementation: &ImplementationIndexEntry) -> Result<String, Diagnostic> {
157157
let ctx = SectionMangler::function(implementation.get_call_name());
158158

159159
let params = self.index.get_declared_parameters(implementation.get_call_name());
160160

161-
let ctx = params.into_iter().fold(ctx, |ctx, param| {
162-
// FIXME: Can we unwrap here?
161+
let ctx = params.into_iter().try_fold(ctx, |ctx, param| -> Result<SectionMangler, Diagnostic> {
163162
let ty = section_names::mangle_type(
164163
self.index,
165-
self.index.get_effective_type_by_name(&param.data_type_name).unwrap(),
166-
);
164+
self.index.get_effective_type_by_name(&param.data_type_name)?,
165+
)?;
167166
let parameter = match param.argument_type {
168167
// TODO: We need to handle the `VariableType` enum as well - this describes the mode of
169168
// argument passing, e.g. inout
170169
index::ArgumentType::ByVal(_) => FunctionArgument::ByValue(ty),
171170
index::ArgumentType::ByRef(_) => FunctionArgument::ByRef(ty),
172171
};
173172

174-
ctx.with_parameter(parameter)
175-
});
173+
Ok(ctx.with_parameter(parameter))
174+
})?;
176175

177176
let return_ty = self
178177
.index
179178
.find_return_type(implementation.get_type_name())
180179
.map(|ty| section_names::mangle_type(self.index, ty));
181180

182-
ctx.with_return_type(return_ty).mangle()
181+
let ctx = match return_ty {
182+
Some(rty) => ctx.with_return_type(rty?),
183+
None => ctx,
184+
};
185+
186+
Ok(ctx.mangle())
183187
}
184188

185189
/// generates an empty llvm function for the given implementation, including all parameters and the return type
@@ -281,7 +285,7 @@ impl<'ink, 'cg> PouGenerator<'ink, 'cg> {
281285

282286
let curr_f = module.add_function(implementation.get_call_name(), function_declaration, None);
283287

284-
let section_name = self.mangle_function(implementation);
288+
let section_name = self.mangle_function(implementation)?;
285289
curr_f.set_section(Some(&section_name));
286290

287291
let pou_name = implementation.get_call_name();

src/codegen/generators/section_names.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
use crate::index::Index;
22
use crate::typesystem::{self, DataTypeInformation, StringEncoding, TypeSize};
3+
use plc_diagnostics::diagnostics::Diagnostic;
34
use section_mangler::{StringEncoding as SectionStringEncoding, Type};
45

5-
pub fn mangle_type(index: &Index, ty: &typesystem::DataType) -> section_mangler::Type {
6+
pub fn mangle_type(index: &Index, ty: &typesystem::DataType) -> Result<section_mangler::Type, Diagnostic> {
67
// TODO: This is a bit ugly because we keep dereferencing references to Copy types like
78
// bool, u32, etc, because `DataTypeInformation::Pointer` keeps a `String` which is not
89
// Copy. the alternative is for section_mangle::Type to keep references everywhere, and
910
// have a lifetime generic parameter, e.g. `section_mangler::Type<'a>` - which is also
1011
// annoying.
11-
match ty.get_type_information() {
12+
let mangled = match ty.get_type_information() {
1213
DataTypeInformation::Void => Type::Void,
1314
DataTypeInformation::Integer { signed, size, semantic_size, .. } => {
1415
Type::Integer { signed: *signed, size: *size, semantic_size: *semantic_size }
@@ -23,11 +24,13 @@ pub fn mangle_type(index: &Index, ty: &typesystem::DataType) -> section_mangler:
2324
Type::String { size: *size as usize, encoding }
2425
}
2526
DataTypeInformation::Pointer { inner_type_name, .. } => Type::Pointer {
26-
inner: Box::new(mangle_type(index, index.get_effective_type_by_name(inner_type_name).unwrap())),
27+
inner: Box::new(mangle_type(index, index.get_effective_type_by_name(inner_type_name)?)?),
2728
},
2829
// FIXME: For now, encode all unknown types as "void" since this is not required for
2930
// execution. Not doing so (and doing an `unreachable!()` for example) obviously causes
3031
// failures, because complex types are already implemented in the compiler.
3132
_ => Type::Void,
32-
}
33+
};
34+
35+
Ok(mangled)
3336
}

src/codegen/generators/variable_generator.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,11 +173,10 @@ impl<'ctx, 'b> VariableGenerator<'ctx, 'b> {
173173

174174
let section = section_mangler::SectionMangler::variable(
175175
global_variable.get_name(),
176-
// FIXME: Can we unwrap here?
177176
section_names::mangle_type(
178177
self.global_index,
179-
self.global_index.get_effective_type_by_name(global_variable.get_type_name()).unwrap(),
180-
),
178+
self.global_index.get_effective_type_by_name(global_variable.get_type_name())?,
179+
)?,
181180
)
182181
.mangle();
183182

0 commit comments

Comments
 (0)