@@ -56,8 +56,12 @@ def gen_impl(self, ty: hir.Type) -> str:
56
56
raise RuntimeError ("invalid float type" )
57
57
case hir .BoolType ():
58
58
return "lc_bool"
59
+ case hir .PointerType (element = element ):
60
+ return f"lc_ptr<{ self .gen (element )} >"
59
61
case hir .VectorType (element = element , count = count ):
60
62
return f"{ self .gen (element )} { count } >"
63
+ case hir .ArrayType (element = element , count = count ):
64
+ return f"lc_array<{ self .gen (element )} , { count } >"
61
65
case hir .StructType (name = name , fields = fields ):
62
66
self .impl .writeln (f'struct { name } {{' )
63
67
for field in fields :
@@ -80,9 +84,13 @@ def do():
80
84
assert ty .instantiated
81
85
return self .gen (ty .instantiated )
82
86
case hir .FunctionType ():
83
- return ''
87
+ name = f'func_{ unique_hash (ty .func_like .name )} _t'
88
+ self .impl .writeln (f'struct { name } {{}}; // function type of { ty .func_like .name } ' )
89
+ return name
84
90
case hir .TypeConstructorType ():
85
- return ''
91
+ name = f'type_{ unique_hash (self .gen (ty .inner ))} _t'
92
+ self .impl .writeln (f'struct { name } {{}}; // type constructor of { ty .inner } ' )
93
+ return name
86
94
case hir .OpaqueType ():
87
95
def do ():
88
96
match ty .name :
@@ -171,8 +179,8 @@ def mangle_impl(self, obj: Union[hir.Type, hir.Function]) -> str:
171
179
case hir .Function (name = name , params = params , return_type = ret ):
172
180
assert ret
173
181
name = mangle_name (name )
174
- params = list (filter (lambda p : not isinstance (
175
- p .type , (hir .FunctionType )), params ))
182
+ # params = list(filter(lambda p: not isinstance(
183
+ # p.type, (hir.FunctionType)), params))
176
184
return f'{ name } _' + unique_hash (f"F{ name } _{ self .mangle (ret )} { '' .join (self .mangle (unwrap (p .type )) for p in params )} " )
177
185
case hir .StructType (name = name ):
178
186
return name
@@ -184,6 +192,10 @@ def mangle_impl(self, obj: Union[hir.Type, hir.Function]) -> str:
184
192
return self .mangle (obj .instantiated )
185
193
case hir .OpaqueType ():
186
194
return obj .name
195
+ case hir .TypeConstructorType ():
196
+ return self .mangle (obj .inner )
197
+ case hir .FunctionType ():
198
+ return f'func_{ unique_hash (obj .func_like .name )} '
187
199
case _:
188
200
raise NotImplementedError (f"unsupported object: { obj } " )
189
201
@@ -246,7 +258,7 @@ def __init__(self, base: CppCodeGen, func: hir.Function) -> None:
246
258
self .name = base .mangling .mangle (func )
247
259
self .func = func
248
260
params = "," .join (self .gen_var (
249
- p ) for p in func .params if not isinstance ( p . type , hir . FunctionType ) )
261
+ p ) for p in func .params )
250
262
assert func .return_type
251
263
252
264
self .signature = f'auto { self .name } ({ params } ) -> { base .type_cache .gen (func .return_type )} '
@@ -285,10 +297,13 @@ def do():
285
297
intrin_name = intrin .name
286
298
gened_args = [self .gen_value_or_ref (
287
299
arg ) for arg in intrin .args ]
288
- if intrin_name == 'buffer_ref' :
289
- return f"{ gened_args [0 ]} [{ gened_args [1 ]} ]"
290
- else :
291
- raise RuntimeError (f"unsupported intrinsic reference: { intrin_name } " )
300
+ match intrin_name :
301
+ case 'buffer.ref' | 'array.ref' :
302
+ return f"{ gened_args [0 ]} [{ gened_args [1 ]} ]"
303
+ case 'buffer.size' | 'array.size' :
304
+ return f"{ gened_args [0 ]} .size"
305
+ case _:
306
+ raise RuntimeError (f"unsupported intrinsic reference: { intrin_name } " )
292
307
return do ()
293
308
case _:
294
309
raise NotImplementedError (f"unsupported reference: { ref } " )
@@ -312,17 +327,40 @@ def gen_value_or_ref(self, value: hir.Value | hir.Ref) -> str:
312
327
def gen_node_checked (self , node : hir .Node ) -> str :
313
328
if isinstance (node , hir .Constant ):
314
329
return self .gen_expr (node )
330
+ if isinstance (node , hir .TypedNode ) and isinstance (node .type , (hir .TypeConstructorType , hir .FunctionType )):
331
+ assert node .type
332
+ return f'{ self .base .type_cache .gen (node .type )} {{}}'
333
+
315
334
return self .node_map [node ]
316
335
317
336
def gen_expr (self , expr : hir .Value ) -> str :
318
- if expr .type and isinstance (expr .type , hir .FunctionType ):
319
- return ''
337
+ # if expr.type and isinstance(expr.type, hir.FunctionType):
338
+ # return ''
339
+ if isinstance (expr , hir .Constant ):
340
+ value = expr .value
341
+ if isinstance (value , int ):
342
+ return f"{ value } "
343
+ elif isinstance (value , float ):
344
+ return f"{ value } f"
345
+ elif isinstance (value , bool ):
346
+ return "true" if value else "false"
347
+ elif isinstance (value , str ):
348
+ return f"\" { value } \" "
349
+ elif isinstance (value , hir .Function ):
350
+ return self .gen_func (value )
351
+ else :
352
+ raise NotImplementedError (
353
+ f"unsupported constant: { expr } " )
320
354
if expr in self .node_map :
321
355
return self .node_map [expr ]
322
356
vid = self .new_vid ()
323
357
324
358
def impl () -> None :
325
359
match expr :
360
+ case hir .TypeValue () as type_value :
361
+ assert type_value .type
362
+ self .base .type_cache .gen (type_value .type )
363
+ return
326
364
case hir .Load () as load :
327
365
self .body .writeln (
328
366
f"const auto &v{ vid } = { self .gen_ref (load .ref )} ; // load" )
@@ -337,36 +375,17 @@ def impl() -> None:
337
375
case hir .Call () as call :
338
376
op = self .gen_func (call .op )
339
377
args_s = ',' .join (self .gen_value_or_ref (
340
- arg ) for arg in call .args if not isinstance ( arg . type , hir . FunctionType ) )
378
+ arg ) for arg in call .args )
341
379
if call .type != hir .UnitType ():
342
380
self .body .writeln (
343
381
f"auto v{ vid } = { op } ({ args_s } );" )
344
382
else :
345
383
self .body .writeln (f"{ op } ({ args_s } );" )
346
- case hir .Constant () as constant :
347
- value = constant .value
348
- if isinstance (value , int ):
349
- self .body .writeln (f"const auto v{ vid } = { value } ;" )
350
- elif isinstance (value , float ):
351
- self .body .writeln (f"const auto v{ vid } = { value } ;" )
352
- elif isinstance (value , bool ):
353
- s = "true" if value else "false"
354
- self .body .writeln (f"const auto v{ vid } = { s } ;" )
355
- elif isinstance (value , str ):
356
- self .body .writeln (f"const auto v{ vid } = \" { value } \" ;" )
357
- elif isinstance (value , hir .Function ):
358
- name = self .gen_func (value )
359
- self .body .writeln (f"auto&& v{ vid } = { name } ;" )
360
- else :
361
- raise NotImplementedError (
362
- f"unsupported constant: { constant } " )
363
384
case hir .AggregateInit ():
364
385
assert expr .type
365
386
ty = self .base .type_cache .gen (expr .type )
366
387
self .body .writeln (
367
388
f"{ ty } v{ vid } {{ { ',' .join (self .gen_expr (e ) for e in expr .args )} }};" )
368
- case hir .TypeValue ():
369
- pass
370
389
case hir .Intrinsic () as intrin :
371
390
def do ():
372
391
intrin_name = intrin .name
@@ -544,7 +563,7 @@ def gen_node(self, node: hir.Node) -> Optional[hir.BasicBlock]:
544
563
ty = self .base .type_cache .gen (alloca .type )
545
564
self .body .writeln (f"{ ty } v{ vid } {{}};" )
546
565
self .node_map [alloca ] = f"v{ vid } "
547
- case hir .AggregateInit () | hir .Intrinsic () | hir .Call () | hir .Constant () | hir .Load () | hir .Index () | hir .Member ():
566
+ case hir .AggregateInit () | hir .Intrinsic () | hir .Call () | hir .Constant () | hir .Load () | hir .Index () | hir .Member () | hir . TypeValue () | hir . FunctionValue () :
548
567
self .gen_expr (node )
549
568
case hir .Member () | hir .Index ():
550
569
pass
@@ -570,8 +589,8 @@ def gen_locals(self):
570
589
for local in self .func .locals :
571
590
if local .name in self .params :
572
591
continue
573
- if isinstance (local .type , (hir .FunctionType , hir .TypeConstructorType )):
574
- continue
592
+ # if isinstance(local.type, (hir.FunctionType, hir.TypeConstructorType)):
593
+ # continue
575
594
assert (
576
595
local .type
577
596
), f"Local variable `{ local .name } ` contains unresolved type"
0 commit comments