Skip to content

Commit a501648

Browse files
committed
wip: running onlinechangexmpl almost works! crashes on signal1()
1 parent f306874 commit a501648

File tree

3 files changed

+109
-21
lines changed

3 files changed

+109
-21
lines changed

compiler/section_mangler/src/lib.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,15 @@ pub const RUSTY_PREFIX: &str = "$RUSTY$";
7272

7373
// TODO: How to encode variadics?
7474
fn mangle_function(FunctionMangler { name, parameters, return_type }: FunctionMangler) -> String {
75-
let mangled = parameters
76-
.into_iter()
77-
/* FIXME: Is that correct? */
78-
.fold(return_type.unwrap_or(Type::Void).to_string(), |mangled, arg| format!("{mangled}[{arg}]"));
75+
/* FIXME: Is that correct? */
76+
let return_type = return_type.unwrap_or(Type::Void);
77+
78+
let mangled = match parameters.as_slice() {
79+
[] => format!("{return_type}[]"),
80+
parameters => {
81+
parameters.iter().fold(return_type.to_string(), |mangled, arg| format!("{mangled}[{arg}]"))
82+
}
83+
};
7984

8085
format!("{name}:{mangled}")
8186
}

compiler/section_mangler/src/parser.rs

Lines changed: 87 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::{FunctionArgument, SectionMangler, Type};
1+
use crate::{FunctionArgument, SectionMangler, StringEncoding, Type};
22

33
use std::str;
44

@@ -75,8 +75,29 @@ fn type_enum(input: &str) -> ParseResult<Type> {
7575
.parse(input)
7676
}
7777

78+
fn string_encoding(input: &str) -> ParseResult<StringEncoding> {
79+
let utf8 = tag("8u").map(|_| StringEncoding::Utf8);
80+
let utf16 = tag("16u").map(|_| StringEncoding::Utf16);
81+
82+
alt((utf8, utf16))(input)
83+
}
84+
85+
fn type_string(input: &str) -> ParseResult<Type> {
86+
char('s')
87+
.and(string_encoding)
88+
.and(number::<usize>)
89+
.map(|((_, encoding), size)| Type::String { size, encoding })
90+
.parse(input)
91+
}
92+
93+
fn type_array(input: &str) -> ParseResult<Type> {
94+
char('a').and(parse_type).map(|(_, inner_ty)| Type::Array { inner: Box::new(inner_ty) }).parse(input)
95+
}
96+
7897
fn parse_type(input: &str) -> ParseResult<Type> {
79-
alt((type_void, type_integer, type_float, type_pointer, type_struct, type_enum))(input)
98+
alt((type_void, type_integer, type_float, type_pointer, type_struct, type_enum, type_string, type_array))(
99+
input,
100+
)
80101
}
81102

82103
fn parse_var_content<'i>(input: &'i str, name: &str) -> ParseResult<'i, SectionMangler> {
@@ -188,6 +209,7 @@ mod tests {
188209
// this needs to be handled by the toplevel parse function
189210
assert!(type_struct("r0u8u8").is_ok());
190211
assert!(type_struct("r1u8u8").is_ok());
212+
assert!(type_struct("r5s8u1025s8u2049s8u3u64s8u3").is_ok());
191213

192214
// invalid number of elements
193215
assert!(type_struct("r15u8").is_err());
@@ -235,4 +257,67 @@ mod tests {
235257

236258
assert_eq!(mangled.name(), "Color.red");
237259
}
260+
261+
#[test]
262+
fn parse_complex1() {
263+
let mangled = SectionMangler::from("$RUSTY$var-__File__init:r5s8u1025s8u2049s8u3u64s8u3");
264+
265+
assert_eq!(mangled.name(), "__File__init");
266+
}
267+
268+
#[test]
269+
fn parse_complex2() {
270+
let inputs = [
271+
"$RUSTY$var-__CosineSignal__init:r4f64i32f64f64",
272+
"$RUSTY$var-__File__init:r5s8u1025s8u2049s8u3u64s8u3",
273+
"$RUSTY$var-__SineSignal__init:r4f64i32f64f64",
274+
"$RUSTY$var-__mainProg_state.Init:e3i32",
275+
"$RUSTY$var-__mainProg_state.Running:e3i32",
276+
"$RUSTY$var-__mainProg_state.Stopped:e3i32",
277+
"$RUSTY$var-__SR__init:r3u8u8u8",
278+
"$RUSTY$var-__RS__init:r3u8u8u8",
279+
"$RUSTY$var-__CTU__init:r6u8u8i16u8i16u8",
280+
"$RUSTY$var-__CTU_INT__init:r6u8u8i16u8i16u8",
281+
"$RUSTY$var-__CTU_DINT__init:r6u8u8i32u8i32u8",
282+
"$RUSTY$var-__CTU_UDINT__init:r6u8u8u32u8u32u8",
283+
"$RUSTY$var-__CTU_LINT__init:r6u8u8i64u8i64u8",
284+
"$RUSTY$var-__CTU_ULINT__init:r6u8u8u64u8u64u8",
285+
"$RUSTY$var-__CTD__init:r6u8u8i16u8i16u8",
286+
"$RUSTY$var-__CTD_INT__init:r6u8u8i16u8i16u8",
287+
"$RUSTY$var-__CTD_DINT__init:r6u8u8i32u8i32u8",
288+
"$RUSTY$var-__CTD_UDINT__init:r6u8u8u32u8u32u8",
289+
"$RUSTY$var-__CTD_LINT__init:r6u8u8i64u8i64u8",
290+
"$RUSTY$var-__CTD_ULINT__init:r6u8u8u64u8u64u8",
291+
"$RUSTY$var-__CTUD__init:r10u8u8u8u8i16u8u8i16u8u8",
292+
"$RUSTY$var-__CTUD_INT__init:r10u8u8u8u8i16u8u8i16u8u8",
293+
"$RUSTY$var-__CTUD_DINT__init:r10u8u8u8u8i32u8u8i32u8u8",
294+
"$RUSTY$var-__CTUD_UDINT__init:r10u8u8u8u8u32u8u8u32u8u8",
295+
"$RUSTY$var-__CTUD_LINT__init:r10u8u8u8u8i64u8u8i64u8u8",
296+
"$RUSTY$var-__CTUD_ULINT__init:r10u8u8u8u8u64u8u8u64u8u8",
297+
"$RUSTY$var-__R_TRIG__init:r3u8u8u8",
298+
"$RUSTY$var-__F_TRIG__init:r3u8u8u8",
299+
"$RUSTY$var-__TP__init:r7u8i64u8i64u8u8au8",
300+
"$RUSTY$var-__TP_TIME__init:r7u8i64u8i64u8u8au8",
301+
"$RUSTY$var-__TP_LTIME__init:r7u8i64u8i64u8u8au8",
302+
"$RUSTY$var-__TON__init:r7u8i64u8i64u8u8au8",
303+
"$RUSTY$var-__TON_TIME__init:r7u8i64u8i64u8u8au8",
304+
"$RUSTY$var-__TON_LTIME__init:r7u8i64u8i64u8u8au8",
305+
"$RUSTY$var-__TOF__init:r7u8i64u8i64u8u8au8",
306+
"$RUSTY$var-__TOF_TIME__init:r7u8i64u8i64u8u8au8",
307+
"$RUSTY$var-__TOF_LTIME__init:r7u8i64u8i64u8u8au8",
308+
"$RUSTY$fn-CosineSignal:v[f64][i32][f64]",
309+
"$RUSTY$fn-File:v[s8u1025][s8u2049][s8u3]",
310+
"$RUSTY$fn-File.Open:v",
311+
"$RUSTY$fn-File.Write:v",
312+
"$RUSTY$fn-File.Close:v",
313+
"$RUSTY$fn-File.Clear:v",
314+
"$RUSTY$fn-SineSignal:v[f64][i32][f64]",
315+
"$RUSTY$fn-mainProg:v",
316+
"$RUSTY$var-mainProg:r7i32r4f64i32f64f64r4f64i32f64f64e3i32r5s8u1025s8u2049s8u3u64s8u3r5s8u1025s8u2049s8u3u64s8u3r5s8u1025s8u2049s8u3u64s8u3"
317+
];
318+
319+
inputs.into_iter().for_each(|input| {
320+
let _ = SectionMangler::from(dbg!(input));
321+
});
322+
}
238323
}

src/codegen.rs

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -193,26 +193,24 @@ impl<'ink> CodeGen<'ink> {
193193
// write_got_layout(new_got_entries, location.as_str(), *format)?;
194194

195195
// Construct our GOT as a new global array. We initialise this array in the loader code.
196-
let got_size = new_got.keys().max().map_or(0, |m| *m + 1);
196+
let got_size: u32 = new_got
197+
.keys()
198+
.max()
199+
.map_or(0, |m| *m + 1)
200+
.try_into()
201+
.expect("the computed custom GOT size is too large");
197202
eprintln!("creating __custom_got array");
198203

199-
let custom_got_ty = BasicTypeEnum::ArrayType(Llvm::get_array_type(
200-
BasicTypeEnum::PointerType(llvm.context.i8_type().ptr_type(0.into())),
201-
got_size.try_into().expect("the computed custom GOT size is too large"),
202-
));
203-
204204
let ptr_ty = llvm.context.i8_type().ptr_type(AddressSpace::default());
205-
let init = ptr_ty.const_array(vec![ptr_ty.const_null(); got_size.try_into().unwrap()].as_slice());
206-
207-
// let initial_value = unsafe {
208-
// inkwell::values::ArrayValue::new_const_array(
209-
// BasicTypeEnum::PointerType(llvm.context.i8_type().ptr_type(AddressSpace::default())),
210-
// vec![llvm.create_null_ptr().unwrap(); got_size.try_into().unwrap()].as_slice(),
211-
// )
212-
// };
205+
let empty_got = ptr_ty
206+
.const_array(vec![ptr_ty.const_null(); got_size as usize].as_slice())
207+
.as_basic_value_enum();
208+
let custom_got_ty =
209+
BasicTypeEnum::ArrayType(Llvm::get_array_type(BasicTypeEnum::PointerType(ptr_ty), got_size));
213210

214211
let custom_got = llvm.create_global_variable(&self.module, "__custom_got", custom_got_ty);
215-
custom_got.set_initial_value(Some(init.as_basic_value_enum()), custom_got_ty);
212+
custom_got.set_linkage(inkwell::module::Linkage::WeakODR);
213+
custom_got.set_initial_value(Some(empty_got), custom_got_ty);
216214

217215
*got_entries = new_got_entries;
218216
}

0 commit comments

Comments
 (0)