cgen: write_fn_attr()
parent
41dca3ef58
commit
277b7b35d0
158
vlib/v/gen/fn.v
158
vlib/v/gen/fn.v
|
@ -34,86 +34,12 @@ fn (mut g Gen) gen_fn_decl(it ast.FnDecl) {
|
|||
g.cur_generic_type = 0
|
||||
return
|
||||
}
|
||||
//
|
||||
if is_main && g.pref.is_liveshared {
|
||||
return
|
||||
}
|
||||
//
|
||||
fn_start_pos := g.out.len
|
||||
|
||||
mut msvc_attrs := ''
|
||||
match g.attr {
|
||||
'inline' {
|
||||
g.write('inline ')
|
||||
}
|
||||
// since these are supported by GCC, clang and MSVC, we can consider them officially supported.
|
||||
'no_inline' {
|
||||
g.write('__NOINLINE ')
|
||||
}
|
||||
'irq_handler' {
|
||||
g.write('__IRQHANDLER ')
|
||||
}
|
||||
|
||||
// GCC/clang attributes
|
||||
// prefixed by _ to indicate they're for advanced users only and not really supported by V.
|
||||
// source for descriptions: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes
|
||||
|
||||
// The cold attribute on functions is used to inform the compiler that the function is unlikely
|
||||
// to be executed. The function is optimized for size rather than speed and on many targets it
|
||||
// is placed into a special subsection of the text section so all cold functions appear close
|
||||
// together, improving code locality of non-cold parts of program.
|
||||
'_cold' {
|
||||
g.write('__attribute__((cold)) ')
|
||||
}
|
||||
// The constructor attribute causes the function to be called automatically before execution
|
||||
// enters main ().
|
||||
'_constructor' {
|
||||
g.write('__attribute__((constructor)) ')
|
||||
}
|
||||
// The destructor attribute causes the function to be called automatically after main ()
|
||||
// completes or exit () is called.
|
||||
'_destructor' {
|
||||
g.write('__attribute__((destructor)) ')
|
||||
}
|
||||
// Generally, inlining into a function is limited. For a function marked with this attribute,
|
||||
// every call inside this function is inlined, if possible.
|
||||
'_flatten' {
|
||||
g.write('__attribute__((flatten)) ')
|
||||
}
|
||||
// The hot attribute on a function is used to inform the compiler that the function is a hot
|
||||
// spot of the compiled program.
|
||||
'_hot' {
|
||||
g.write('__attribute__((hot)) ')
|
||||
}
|
||||
// This tells the compiler that a function is malloc-like, i.e., that the pointer P returned by
|
||||
// the function cannot alias any other pointer valid when the function returns, and moreover no
|
||||
// pointers to valid objects occur in any storage addressed by P.
|
||||
'_malloc' {
|
||||
g.write('__attribute__((malloc)) ')
|
||||
}
|
||||
|
||||
// Calls to functions whose return value is not affected by changes to the observable state
|
||||
// of the program and that have no observable effects on such state other than to return a
|
||||
// value may lend themselves to optimizations such as common subexpression elimination.
|
||||
// Declaring such functions with the const attribute allows GCC to avoid emitting some calls in
|
||||
// repeated invocations of the function with the same argument values.
|
||||
'_pure' {
|
||||
g.write('__attribute__((const)) ')
|
||||
}
|
||||
|
||||
// windows attributes (msvc/mingw)
|
||||
// prefixed by windows to indicate they're for advanced users only and not really supported by V.
|
||||
|
||||
'windows_stdcall' {
|
||||
msvc_attrs += '__stdcall '
|
||||
}
|
||||
|
||||
else {
|
||||
// nothing but keep V happy
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
msvc_attrs := g.write_fn_attr()
|
||||
// Live
|
||||
is_livefn := g.attr == 'live'
|
||||
is_livemain := g.pref.is_livemain && is_livefn
|
||||
is_liveshared := g.pref.is_liveshared && is_livefn
|
||||
|
@ -309,6 +235,7 @@ fn (mut g Gen) write_defer_stmts_when_needed() {
|
|||
}
|
||||
}
|
||||
|
||||
// fn decl args
|
||||
fn (mut g Gen) fn_args(args []table.Arg, is_variadic bool) ([]string, []string) {
|
||||
mut fargs := []string{}
|
||||
mut fargtypes := []string{}
|
||||
|
@ -319,7 +246,7 @@ fn (mut g Gen) fn_args(args []table.Arg, is_variadic bool) ([]string, []string)
|
|||
arg_type_sym := g.table.get_type_symbol(typ)
|
||||
mut arg_type_name := g.typ(typ) // arg_type_sym.name.replace('.', '__')
|
||||
// if arg.name == 'xxx' {
|
||||
// println('! ' + arg_type_name)
|
||||
// println('xxx arg type= ' + arg_type_name)
|
||||
// }
|
||||
is_varg := i == args.len - 1 && is_variadic
|
||||
if is_varg {
|
||||
|
@ -774,3 +701,80 @@ fn (mut g Gen) is_gui_app() bool {
|
|||
fn (g &Gen) fileis(s string) bool {
|
||||
return g.file.path.contains(s)
|
||||
}
|
||||
|
||||
fn (mut g Gen) write_fn_attr() string{
|
||||
mut msvc_attrs := ''
|
||||
match g.attr {
|
||||
'inline' {
|
||||
g.write('inline ')
|
||||
}
|
||||
// since these are supported by GCC, clang and MSVC, we can consider them officially supported.
|
||||
'no_inline' {
|
||||
g.write('__NOINLINE ')
|
||||
}
|
||||
'irq_handler' {
|
||||
g.write('__IRQHANDLER ')
|
||||
}
|
||||
|
||||
// GCC/clang attributes
|
||||
// prefixed by _ to indicate they're for advanced users only and not really supported by V.
|
||||
// source for descriptions: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes
|
||||
|
||||
// The cold attribute on functions is used to inform the compiler that the function is unlikely
|
||||
// to be executed. The function is optimized for size rather than speed and on many targets it
|
||||
// is placed into a special subsection of the text section so all cold functions appear close
|
||||
// together, improving code locality of non-cold parts of program.
|
||||
'_cold' {
|
||||
g.write('__attribute__((cold)) ')
|
||||
}
|
||||
// The constructor attribute causes the function to be called automatically before execution
|
||||
// enters main ().
|
||||
'_constructor' {
|
||||
g.write('__attribute__((constructor)) ')
|
||||
}
|
||||
// The destructor attribute causes the function to be called automatically after main ()
|
||||
// completes or exit () is called.
|
||||
'_destructor' {
|
||||
g.write('__attribute__((destructor)) ')
|
||||
}
|
||||
// Generally, inlining into a function is limited. For a function marked with this attribute,
|
||||
// every call inside this function is inlined, if possible.
|
||||
'_flatten' {
|
||||
g.write('__attribute__((flatten)) ')
|
||||
}
|
||||
// The hot attribute on a function is used to inform the compiler that the function is a hot
|
||||
// spot of the compiled program.
|
||||
'_hot' {
|
||||
g.write('__attribute__((hot)) ')
|
||||
}
|
||||
// This tells the compiler that a function is malloc-like, i.e., that the pointer P returned by
|
||||
// the function cannot alias any other pointer valid when the function returns, and moreover no
|
||||
// pointers to valid objects occur in any storage addressed by P.
|
||||
'_malloc' {
|
||||
g.write('__attribute__((malloc)) ')
|
||||
}
|
||||
|
||||
// Calls to functions whose return value is not affected by changes to the observable state
|
||||
// of the program and that have no observable effects on such state other than to return a
|
||||
// value may lend themselves to optimizations such as common subexpression elimination.
|
||||
// Declaring such functions with the const attribute allows GCC to avoid emitting some calls in
|
||||
// repeated invocations of the function with the same argument values.
|
||||
'_pure' {
|
||||
g.write('__attribute__((const)) ')
|
||||
}
|
||||
|
||||
// windows attributes (msvc/mingw)
|
||||
// prefixed by windows to indicate they're for advanced users only and not really supported by V.
|
||||
|
||||
'windows_stdcall' {
|
||||
msvc_attrs += '__stdcall '
|
||||
}
|
||||
|
||||
else {
|
||||
// nothing but keep V happy
|
||||
}
|
||||
}
|
||||
return msvc_attrs
|
||||
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue