ssa: compile go string constant without alloca
This commit is contained in:
@@ -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))
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
`)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user