aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2022-05-02 10:53:14 +0100
committerPhilip Herron <philip.herron@embecosm.com>2022-05-02 10:53:14 +0100
commitcf9d65a913640ecb4f839fbe2e7683ee00dc07f3 (patch)
tree9560ca20fc0aa6c946ec84e057b6601b20dde6e4
parentf38bf60c3ac7f039db5ff5c7c0587325097892c8 (diff)
downloadgcc-cf9d65a913640ecb4f839fbe2e7683ee00dc07f3.zip
gcc-cf9d65a913640ecb4f839fbe2e7683ee00dc07f3.tar.gz
gcc-cf9d65a913640ecb4f839fbe2e7683ee00dc07f3.tar.bz2
Generic functions should not be TREE_PUBLIC
Generic functions cannot be public since the symbols could overlap in linking other crates reusing the same generic. The other benifit here is that when optimizations are turned on we can eliminate more code since the symbol does not _need_ to be public.
-rw-r--r--gcc/rust/backend/rust-compile-base.cc8
-rw-r--r--gcc/rust/backend/rust-compile-base.h2
2 files changed, 6 insertions, 4 deletions
diff --git a/gcc/rust/backend/rust-compile-base.cc b/gcc/rust/backend/rust-compile-base.cc
index b969b7a..49f31fc 100644
--- a/gcc/rust/backend/rust-compile-base.cc
+++ b/gcc/rust/backend/rust-compile-base.cc
@@ -38,14 +38,14 @@ bool inline should_mangle_item (const tree fndecl)
void
HIRCompileBase::setup_fndecl (tree fndecl, bool is_main_entry_point,
- HIR::Visibility &visibility,
+ bool is_generic_fn, HIR::Visibility &visibility,
const HIR::FunctionQualifiers &qualifiers,
const AST::AttrVec &attrs)
{
// if its the main fn or pub visibility mark its as DECL_PUBLIC
// please see https://github.com/Rust-GCC/gccrs/pull/137
bool is_pub = visibility.get_vis_type () == HIR::Visibility::VisType::PUBLIC;
- if (is_main_entry_point || is_pub)
+ if (is_main_entry_point || (is_pub && !is_generic_fn))
{
TREE_PUBLIC (fndecl) = 1;
}
@@ -427,7 +427,9 @@ HIRCompileBase::compile_function (
unsigned int flags = 0;
tree fndecl = ctx->get_backend ()->function (compiled_fn_type, ir_symbol_name,
"" /* asm_name */, flags, locus);
- setup_fndecl (fndecl, is_main_fn, visibility, qualifiers, outer_attrs);
+
+ setup_fndecl (fndecl, is_main_fn, fntype->has_subsititions_defined (),
+ visibility, qualifiers, outer_attrs);
setup_abi_options (fndecl, fntype->get_abi ());
// conditionally mangle the function name
diff --git a/gcc/rust/backend/rust-compile-base.h b/gcc/rust/backend/rust-compile-base.h
index c09c562..f12913c 100644
--- a/gcc/rust/backend/rust-compile-base.h
+++ b/gcc/rust/backend/rust-compile-base.h
@@ -76,7 +76,7 @@ protected:
tree expression, Location locus);
static void setup_fndecl (tree fndecl, bool is_main_entry_point,
- HIR::Visibility &visibility,
+ bool is_generic_fn, HIR::Visibility &visibility,
const HIR::FunctionQualifiers &qualifiers,
const AST::AttrVec &attrs);