cl: compileInstrAndValue bugfix
This commit is contained in:
@@ -83,13 +83,19 @@ func (p *context) compileBlock(b llssa.Builder, block *ssa.BasicBlock) llssa.Bas
|
|||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *context) compileInstrAndValue(b llssa.Builder, iv instrAndValue) llssa.Expr {
|
func (p *context) compileInstrAndValue(b llssa.Builder, iv instrAndValue) (ret llssa.Expr) {
|
||||||
|
if v, ok := p.vals[iv]; ok {
|
||||||
|
return v
|
||||||
|
}
|
||||||
switch v := iv.(type) {
|
switch v := iv.(type) {
|
||||||
case *ssa.UnOp:
|
case *ssa.UnOp:
|
||||||
x := p.compileValue(b, v.X)
|
x := p.compileValue(b, v.X)
|
||||||
return b.UnOp(v.Op, x)
|
ret = b.UnOp(v.Op, x)
|
||||||
|
default:
|
||||||
|
panic(fmt.Sprintf("compileInstrAndValue: unknown instr - %T\n", iv))
|
||||||
}
|
}
|
||||||
panic(fmt.Sprintf("compileInstrAndValue: unknown instr - %T\n", iv))
|
p.vals[iv] = ret
|
||||||
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *context) compileInstr(b llssa.Builder, instr ssa.Instruction) {
|
func (p *context) compileInstr(b llssa.Builder, instr ssa.Instruction) {
|
||||||
@@ -128,25 +134,19 @@ func (p *context) compileInstr(b llssa.Builder, instr ssa.Instruction) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *context) compileValue(b llssa.Builder, v ssa.Value) (ret llssa.Expr) {
|
func (p *context) compileValue(b llssa.Builder, v ssa.Value) llssa.Expr {
|
||||||
if e, ok := p.vals[v]; ok {
|
|
||||||
return e
|
|
||||||
}
|
|
||||||
if iv, ok := v.(instrAndValue); ok {
|
if iv, ok := v.(instrAndValue); ok {
|
||||||
ret = p.compileInstrAndValue(b, iv)
|
return p.compileInstrAndValue(b, iv)
|
||||||
} else {
|
}
|
||||||
switch v := v.(type) {
|
switch v := v.(type) {
|
||||||
case *ssa.Global:
|
case *ssa.Global:
|
||||||
g := p.compileGlobal(p.pkg, v)
|
g := p.compileGlobal(p.pkg, v)
|
||||||
ret = g.Expr
|
return g.Expr
|
||||||
case *ssa.Const:
|
case *ssa.Const:
|
||||||
ret = b.Const(v.Value, v.Type())
|
return b.Const(v.Value, v.Type())
|
||||||
default:
|
default:
|
||||||
panic(fmt.Sprintf("compileValue: unknown value - %T\n", v))
|
panic(fmt.Sprintf("compileValue: unknown value - %T\n", v))
|
||||||
}
|
|
||||||
}
|
}
|
||||||
p.vals[v] = ret
|
|
||||||
return ret
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -72,8 +72,7 @@ source_filename = "foo"
|
|||||||
define void @init() {
|
define void @init() {
|
||||||
_llgo_0:
|
_llgo_0:
|
||||||
%0 = load i1, ptr @"init$guard", align 1
|
%0 = load i1, ptr @"init$guard", align 1
|
||||||
%1 = load i1, ptr @"init$guard", align 1
|
br i1 %0, label %_llgo_2, label %_llgo_1
|
||||||
br i1 %1, label %_llgo_2, label %_llgo_1
|
|
||||||
|
|
||||||
_llgo_1: ; preds = %_llgo_0
|
_llgo_1: ; preds = %_llgo_0
|
||||||
store i1 true, ptr @"init$guard", align 1
|
store i1 true, ptr @"init$guard", align 1
|
||||||
|
|||||||
109
cl/symbol.go
109
cl/symbol.go
@@ -1,109 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2023 The GoPlus Authors (goplus.org). All rights reserved.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package cl
|
|
||||||
|
|
||||||
/*
|
|
||||||
import (
|
|
||||||
"go/types"
|
|
||||||
|
|
||||||
"github.com/goplus/llgo/loader"
|
|
||||||
"golang.org/x/tools/go/ssa"
|
|
||||||
llvm "tinygo.org/x/go-llvm"
|
|
||||||
)
|
|
||||||
|
|
||||||
// functionInfo contains some information about a function or method. In
|
|
||||||
// particular, it contains information obtained from pragmas.
|
|
||||||
//
|
|
||||||
// The linkName value contains a valid link name, even if //go:linkname is not
|
|
||||||
// present.
|
|
||||||
type functionInfo struct {
|
|
||||||
/*
|
|
||||||
wasmModule string // go:wasm-module
|
|
||||||
wasmName string // wasm-export-name or wasm-import-name in the IR
|
|
||||||
linkName string // go:linkname, go:export - the IR function name
|
|
||||||
section string // go:section - object file section name
|
|
||||||
exported bool // go:export, CGo
|
|
||||||
interrupt bool // go:interrupt
|
|
||||||
nobounds bool // go:nobounds
|
|
||||||
variadic bool // go:variadic (CGo only)
|
|
||||||
inline inlineType // go:inline
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
linkName string // go:linkname, go:export - the IR function name
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
type inlineType int
|
|
||||||
|
|
||||||
// How much to inline.
|
|
||||||
const (
|
|
||||||
// Default behavior. The compiler decides for itself whether any given
|
|
||||||
// function will be inlined. Whether any function is inlined depends on the
|
|
||||||
// optimization level.
|
|
||||||
inlineDefault inlineType = iota
|
|
||||||
|
|
||||||
// Inline hint, just like the C inline keyword (signalled using
|
|
||||||
// //go:inline). The compiler will be more likely to inline this function,
|
|
||||||
// but it is not a guarantee.
|
|
||||||
inlineHint
|
|
||||||
|
|
||||||
// Don't inline, just like the GCC noinline attribute. Signalled using
|
|
||||||
// //go:noinline.
|
|
||||||
inlineNone
|
|
||||||
)
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
// getFunctionInfo returns information about a function that is not directly
|
|
||||||
// present in *ssa.Function, such as the link name and whether it should be
|
|
||||||
// exported.
|
|
||||||
func (c *context) getFunctionInfo(f *ssa.Function) functionInfo {
|
|
||||||
panic("todo")
|
|
||||||
}
|
|
||||||
|
|
||||||
// globalInfo contains some information about a specific global. By default,
|
|
||||||
// linkName is equal to .RelString(nil) on a global and extern is false, but for
|
|
||||||
// some symbols this is different (due to //go:extern for example).
|
|
||||||
type globalInfo struct {
|
|
||||||
/*
|
|
||||||
linkName string // go:extern
|
|
||||||
align int // go:align
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
section string // go:section
|
|
||||||
extern bool // go:extern
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *context) loadASTComments(loader.Package) {
|
|
||||||
panic("todo")
|
|
||||||
}
|
|
||||||
|
|
||||||
// getGlobal returns a LLVM IR global value for a Go SSA global. It is added to
|
|
||||||
// the LLVM IR if it has not been added already.
|
|
||||||
func (c *context) getGlobal(g *ssa.Global) llvm.Value {
|
|
||||||
panic("todo")
|
|
||||||
}
|
|
||||||
|
|
||||||
// getGlobalInfo returns some information about a specific global.
|
|
||||||
func (c *context) getGlobalInfo(g *ssa.Global) globalInfo {
|
|
||||||
panic("todo")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get all methods of a type.
|
|
||||||
func getAllMethods(prog *ssa.Program, typ types.Type) []*types.Selection {
|
|
||||||
panic("todo")
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
Reference in New Issue
Block a user