package generator import "fmt" import "git.tebibyte.media/fspl/fspl/llvm" import "git.tebibyte.media/fspl/fspl/entity" func (this *generator) generateTypedef ( def *entity.Typedef, ) ( llvm.Type, error, ) { key := entity.Key { Unit: def.Unit(), Name: def.Name, } irType, err := this.generateType(def.Type) if err != nil { return nil, err } irTypeDef := this.module.NewType(key.LinkName(), irType) this.types[key] = irTypeDef return irTypeDef, nil } func (this *generator) generateType (ty entity.Type) (llvm.Type, error) { switch ty.(type) { case nil: return llvm.Void, nil case *entity.TypeNamed: return this.generateTypeNamed(ty.(*entity.TypeNamed)) case *entity.TypePointer: return this.generateTypePointer(ty.(*entity.TypePointer)) case *entity.TypeSlice: return this.generateTypeSlice(ty.(*entity.TypeSlice)) case *entity.TypeArray: return this.generateTypeArray(ty.(*entity.TypeArray)) case *entity.TypeStruct: return this.generateTypeStruct(ty.(*entity.TypeStruct)) case *entity.TypeInterface: return this.generateTypeInterface(ty.(*entity.TypeInterface)) case *entity.TypeUnion: return this.generateTypeUnion(ty.(*entity.TypeUnion)) case *entity.TypeInt: return this.generateTypeInt(ty.(*entity.TypeInt)) case *entity.TypeFloat: return this.generateTypeFloat(ty.(*entity.TypeFloat)) case *entity.TypeWord: return this.generateTypeWord(ty.(*entity.TypeWord)) default: panic(fmt.Sprintln("generator doesn't know about type", ty)) } }