Mark most Go functions as private (removing dead code) and configure to
optimize for size.
Этот коммит содержится в:
Ayke van Laethem 2018-04-26 17:16:54 +02:00
родитель a446b4de97
коммит 775445cceb

10
tgo.go
Просмотреть файл

@ -425,6 +425,11 @@ func (c *Compiler) parseFuncDecl(f *ssa.Function) (*Frame, error) {
} }
func (c *Compiler) parseFunc(frame *Frame, f *ssa.Function) error { func (c *Compiler) parseFunc(frame *Frame, f *ssa.Function) error {
if frame.llvmFn.Name() != "main.main" {
// This function is only used from within Go.
frame.llvmFn.SetLinkage(llvm.PrivateLinkage)
}
// Pre-create all basic blocks in the function. // Pre-create all basic blocks in the function.
for _, block := range f.DomPreorder() { for _, block := range f.DomPreorder() {
llvmBlock := c.ctx.AddBasicBlock(frame.llvmFn, block.Comment) llvmBlock := c.ctx.AddBasicBlock(frame.llvmFn, block.Comment)
@ -1028,10 +1033,11 @@ func (c *Compiler) Verify() error {
return llvm.VerifyModule(c.mod, 0) return llvm.VerifyModule(c.mod, 0)
} }
func (c *Compiler) Optimize(optLevel int) { func (c *Compiler) Optimize(optLevel, sizeLevel int) {
builder := llvm.NewPassManagerBuilder() builder := llvm.NewPassManagerBuilder()
defer builder.Dispose() defer builder.Dispose()
builder.SetOptLevel(optLevel) builder.SetOptLevel(optLevel)
builder.SetSizeLevel(sizeLevel)
builder.UseInlinerWithThreshold(200) // TODO depend on opt level, and -Os builder.UseInlinerWithThreshold(200) // TODO depend on opt level, and -Os
funcPasses := llvm.NewFunctionPassManagerForModule(c.mod) funcPasses := llvm.NewFunctionPassManagerForModule(c.mod)
@ -1097,7 +1103,7 @@ func Compile(pkgName, outpath, target string, printIR bool) error {
if err := c.Verify(); err != nil { if err := c.Verify(); err != nil {
return err return err
} }
c.Optimize(2) c.Optimize(2, 1) // -O2 -Os
if err := c.Verify(); err != nil { if err := c.Verify(); err != nil {
return err return err
} }