mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-02 01:57:48 +00:00
2bb70812a8
This patch adds a new pragma for functions and globals to set the
section name. This can be useful to place a function or global in a
special device specific section, for example:
* Functions may be placed in RAM to make them run faster, or in flash
(if RAM is the default) to not let them take up RAM.
* DMA memory may only be placed in a special memory area.
* Some RAM may be faster than other RAM, and some globals may be
performance critical thus placing them in this special RAM area can
help.
* Some (large) global variables may need to be placed in external RAM,
which can be done by placing them in a special section.
To use it, you have to place a function or global in a special section,
for example:
//go:section .externalram
var externalRAMBuffer [1024]byte
This can then be placed in a special section of the linker script, for
example something like this:
.bss.extram (NOLOAD) : {
*(.externalram)
} > ERAM
35 lines
1.1 KiB
Go
35 lines
1.1 KiB
Go
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() && llvmFn.Section() == "" {
|
|
name := llvmFn.Name()
|
|
llvmFn.SetSection(".text." + name)
|
|
}
|
|
llvmFn = llvm.NextFunction(llvmFn)
|
|
}
|
|
}
|
|
|
|
// DisableTailCalls adds the "disable-tail-calls"="true" function attribute to
|
|
// all functions. This may be necessary, in particular to avoid an error with
|
|
// WebAssembly in LLVM 11.
|
|
func DisableTailCalls(mod llvm.Module) {
|
|
attribute := mod.Context().CreateStringAttribute("disable-tail-calls", "true")
|
|
llvmFn := mod.FirstFunction()
|
|
for !llvmFn.IsNil() {
|
|
if !llvmFn.IsDeclaration() {
|
|
llvmFn.AddFunctionAttr(attribute)
|
|
}
|
|
llvmFn = llvm.NextFunction(llvmFn)
|
|
}
|
|
}
|