@@ -6476,16 +6476,60 @@ export class Codegen {
64766476
64776477 private usedSatIntrinsics ?: Set < string > ;
64786478
6479+ private tryConstantExpr ( expr : import ( "./hir" ) . HIRExpr ) : string | null {
6480+ switch ( expr . kind ) {
6481+ case "IntLit" : return expr . value . toString ( ) ;
6482+ case "FloatLit" : {
6483+ const buf = new ArrayBuffer ( 8 ) ;
6484+ new Float64Array ( buf ) [ 0 ] = expr . value ;
6485+ const bits = new BigUint64Array ( buf ) [ 0 ] ;
6486+ return `0x${ bits . toString ( 16 ) . toUpperCase ( ) . padStart ( 16 , "0" ) } ` ;
6487+ }
6488+ case "BoolLit" : return expr . value ? "1" : "0" ;
6489+ case "Cast" :
6490+ if ( expr . type . tag === "ptr" ) return "null" ;
6491+ return null ;
6492+ case "StructLit" : {
6493+ const layout = this . structLayouts . get ( expr . name ) ;
6494+ if ( ! layout ) return null ;
6495+ const fieldVals : string [ ] = [ ] ;
6496+ for ( const lf of layout . fields ) {
6497+ const ef = expr . fields . find ( f => f . name === lf . name ) ;
6498+ if ( ! ef ) return null ;
6499+ const val = this . tryConstantExpr ( ef . value ) ;
6500+ if ( val === null ) return null ;
6501+ fieldVals . push ( `${ lf . type } ${ val } ` ) ;
6502+ }
6503+ return `{ ${ fieldVals . join ( ", " ) } }` ;
6504+ }
6505+ case "ArrayLit" : {
6506+ if ( expr . type . tag !== "array" || expr . type . size === null ) return null ;
6507+ const elemTy = this . llvmType ( expr . type . element ) ;
6508+ const elemVals : string [ ] = [ ] ;
6509+ for ( const elem of expr . elements ) {
6510+ const val = this . tryConstantExpr ( elem ) ;
6511+ if ( val === null ) return null ;
6512+ elemVals . push ( `${ elemTy } ${ val } ` ) ;
6513+ }
6514+ return `[${ elemVals . join ( ", " ) } ]` ;
6515+ }
6516+ case "ArrayRepeat" : {
6517+ const elemKind = expr . type . tag === "array" ? expr . type . element : { tag : "int" as const , bits : 32 , signed : true } ;
6518+ const elemTy = this . llvmType ( elemKind ) ;
6519+ const val = this . tryConstantExpr ( expr . value ) ;
6520+ if ( val === null ) return null ;
6521+ if ( val === "0" || val === "zeroinitializer" ) return "zeroinitializer" ;
6522+ const elems = Array ( expr . count ) . fill ( `${ elemTy } ${ val } ` ) ;
6523+ return `[${ elems . join ( ", " ) } ]` ;
6524+ }
6525+ default :
6526+ return null ;
6527+ }
6528+ }
6529+
64796530 private getConstantInitializer ( g : import ( "./hir" ) . HIRGlobal ) : string {
6480- if ( g . value . kind === "IntLit" ) return g . value . value . toString ( ) ;
6481- if ( g . value . kind === "FloatLit" ) {
6482- const buf = new ArrayBuffer ( 8 ) ;
6483- new Float64Array ( buf ) [ 0 ] = g . value . value ;
6484- const bits = new BigUint64Array ( buf ) [ 0 ] ;
6485- return `0x${ bits . toString ( 16 ) . toUpperCase ( ) . padStart ( 16 , "0" ) } ` ;
6486- }
6487- if ( g . value . kind === "BoolLit" ) return g . value . value ? "1" : "0" ;
6488- if ( g . value . kind === "Cast" && g . type . tag === "ptr" ) return "null" ;
6531+ const constVal = this . tryConstantExpr ( g . value ) ;
6532+ if ( constVal !== null ) return constVal ;
64896533 if ( g . type . tag === "ptr" ) return "null" ;
64906534 const tag = g . type . tag ;
64916535 if ( tag === "struct" || tag === "array" || tag === "enum" || tag === "string" || tag === "vec" || tag === "hashmap" || tag === "tuple" ) {
0 commit comments