ssa: compile go string constant without alloca

This commit is contained in:
Li Jie
2024-11-24 15:19:16 +08:00
parent 17832fe18c
commit 43c1bc8d5f
73 changed files with 9742 additions and 21877 deletions

View File

@@ -234,7 +234,7 @@ func (b Builder) Const(v constant.Value, typ Type) Expr {
v, _ := constant.Float64Val(constant.ToFloat(v))
return prog.FloatVal(v, typ)
case kind == types.String:
return Expr{b.Str(constant.StringVal(v)).impl, typ}
return b.Str(constant.StringVal(v))
case kind == types.Complex128 || kind == types.Complex64:
v = constant.ToComplex(v)
re, _ := constant.Float64Val(constant.Real(v))

View File

@@ -56,9 +56,11 @@ func (b Builder) aggregateValue(t Type, flds ...llvm.Value) Expr {
}
func aggregateValue(b llvm.Builder, tll llvm.Type, flds ...llvm.Value) llvm.Value {
ptr := llvm.CreateAlloca(b, tll)
aggregateInit(b, ptr, tll, flds...)
return llvm.CreateLoad(b, tll, ptr)
agg := llvm.Undef(tll)
for i, fld := range flds {
agg = b.CreateInsertValue(agg, fld, i, "")
}
return agg
}
func aggregateInit(b llvm.Builder, ptr llvm.Value, tll llvm.Type, flds ...llvm.Value) {

View File

@@ -346,6 +346,7 @@ func (p Program) NewPackage(name, pkgPath string) Package {
pyobjs := make(map[string]PyObjRef)
pymods := make(map[string]Global)
strs := make(map[string]llvm.Value)
goStrs := make(map[string]llvm.Value)
chkabi := make(map[types.Type]bool)
glbDbgVars := make(map[Expr]bool)
p.NeedRuntime = false
@@ -353,7 +354,8 @@ func (p Program) NewPackage(name, pkgPath string) Package {
// p.needPyInit = false
ret := &aPackage{
mod: mod, vars: gbls, fns: fns, stubs: stubs,
pyobjs: pyobjs, pymods: pymods, strs: strs, chkabi: chkabi, Prog: p,
pyobjs: pyobjs, pymods: pymods, strs: strs, goStrs: goStrs,
chkabi: chkabi, Prog: p,
di: nil, cu: nil, glbDbgVars: glbDbgVars,
}
ret.abi.Init(pkgPath)
@@ -603,6 +605,7 @@ type aPackage struct {
pyobjs map[string]PyObjRef
pymods map[string]Global
strs map[string]llvm.Value
goStrs map[string]llvm.Value
chkabi map[types.Type]bool
afterb unsafe.Pointer
patch func(types.Type) types.Type

View File

@@ -370,13 +370,8 @@ source_filename = "foo/bar"
define { i64, double } @fn(double %0) {
_llgo_0:
%1 = alloca { i64, double }, align 8
%2 = getelementptr inbounds { i64, double }, ptr %1, i32 0, i32 0
store ptr @a, ptr %2, align 8
%3 = getelementptr inbounds { i64, double }, ptr %1, i32 0, i32 1
store double %0, ptr %3, align 8
%4 = load { i64, double }, ptr %1, align 8
ret { i64, double } %4
%1 = insertvalue { i64, double } { ptr @a, double undef }, double %0, 1
ret { i64, double } %1
}
`)
}