compiler: move ApplyFunctionSections to transform package

Этот коммит содержится в:
Ayke van Laethem 2020-03-18 20:32:46 +01:00 коммит произвёл Ron Evans
родитель 945ff4d160
коммит b6314fa6ab
6 изменённых файлов: 51 добавлений и 14 удалений

Просмотреть файл

@ -53,7 +53,7 @@ func Build(pkgName, outpath string, config *compileopts.Config, action func(stri
}
if config.GOOS() != "darwin" {
c.ApplyFunctionSections() // -ffunction-sections
transform.ApplyFunctionSections(c.Module()) // -ffunction-sections
}
// Browsers cannot handle external functions that have type i64 because it

Просмотреть файл

@ -2585,19 +2585,6 @@ func (c *Compiler) Verify() error {
return llvm.VerifyModule(c.mod, llvm.PrintMessageAction)
}
func (c *Compiler) ApplyFunctionSections() {
// Put every function in a separate section. This makes it possible for the
// linker to remove dead code (-ffunction-sections).
llvmFn := c.mod.FirstFunction()
for !llvmFn.IsNil() {
if !llvmFn.IsDeclaration() {
name := llvmFn.Name()
llvmFn.SetSection(".text." + name)
}
llvmFn = llvm.NextFunction(llvmFn)
}
}
// Turn all global constants into global variables. This works around a
// limitation on Harvard architectures (e.g. AVR), where constant and
// non-constant pointers point to a different address space.

20
transform/globals.go Обычный файл
Просмотреть файл

@ -0,0 +1,20 @@
package transform
import "tinygo.org/x/go-llvm"
// This file implements small transformations on globals (functions and global
// variables) for specific ABIs/architectures.
// ApplyFunctionSections puts every function in a separate section. This makes
// it possible for the linker to remove dead code. It is the equivalent of
// passing -ffunction-sections to a C compiler.
func ApplyFunctionSections(mod llvm.Module) {
llvmFn := mod.FirstFunction()
for !llvmFn.IsNil() {
if !llvmFn.IsDeclaration() {
name := llvmFn.Name()
llvmFn.SetSection(".text." + name)
}
llvmFn = llvm.NextFunction(llvmFn)
}
}

14
transform/globals_test.go Обычный файл
Просмотреть файл

@ -0,0 +1,14 @@
package transform
import (
"testing"
"tinygo.org/x/go-llvm"
)
func TestApplyFunctionSections(t *testing.T) {
t.Parallel()
testTransform(t, "testdata/globals-function-sections", func(mod llvm.Module) {
ApplyFunctionSections(mod)
})
}

8
transform/testdata/globals-function-sections.ll предоставленный Обычный файл
Просмотреть файл

@ -0,0 +1,8 @@
target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"
target triple = "armv7em-none-eabi"
declare void @foo()
define void @bar() {
ret void
}

8
transform/testdata/globals-function-sections.out.ll предоставленный Обычный файл
Просмотреть файл

@ -0,0 +1,8 @@
target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"
target triple = "armv7em-none-eabi"
declare void @foo()
define void @bar() section ".text.bar" {
ret void
}