diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2021-05-13 14:36:25 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-05-13 14:36:25 +0000 |
commit | 5d7fbc4a78897f8f561bdd78b4d3bbc15f4b351f (patch) | |
tree | 167d95c3c3e816ddb3284ed078027f8a9ef1b7c6 /gcc/rust/backend/rust-compile-context.h | |
parent | 5134aaa9f0b37ea372cb185fe7aa6c26fe0a4c2e (diff) | |
parent | fcd4ed431272414157eb90773f174405431eb6bd (diff) | |
download | gcc-5d7fbc4a78897f8f561bdd78b4d3bbc15f4b351f.zip gcc-5d7fbc4a78897f8f561bdd78b4d3bbc15f4b351f.tar.gz gcc-5d7fbc4a78897f8f561bdd78b4d3bbc15f4b351f.tar.bz2 |
Merge #427
427: Fix duplicate function generation in the backend r=philberty a=philberty
Fix duplicated function generation for generics
When emitting the backend IR we need to check if we have already compiled
one already. This is all due to the fact when we do generic substitutions
in type resolution its only upon usage of a function the function is
substituted it gains a new unique ty_ref HIR ID to make sure new
substituted versions of a type have unique ids.
Fixes #403
Co-authored-by: Philip Herron <philip.herron@embecosm.com>
Diffstat (limited to 'gcc/rust/backend/rust-compile-context.h')
-rw-r--r-- | gcc/rust/backend/rust-compile-context.h | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/gcc/rust/backend/rust-compile-context.h b/gcc/rust/backend/rust-compile-context.h index 7db4ea2..45fb6c2 100644 --- a/gcc/rust/backend/rust-compile-context.h +++ b/gcc/rust/backend/rust-compile-context.h @@ -157,13 +157,38 @@ public: return true; } - void insert_function_decl (HirId id, ::Bfunction *fn) + void insert_function_decl (HirId id, ::Bfunction *fn, + const TyTy::BaseType *ref) { + rust_assert (compiled_fn_map.find (id) == compiled_fn_map.end ()); compiled_fn_map[id] = fn; + if (ref != nullptr) + { + std::pair<HirId, ::Bfunction *> elem (id, fn); + mono_fns[ref] = std::move (elem); + } } - bool lookup_function_decl (HirId id, ::Bfunction **fn) + bool lookup_function_decl (HirId id, ::Bfunction **fn, + const TyTy::BaseType *ref = nullptr) { + // for for any monomorphized fns + if (ref != nullptr) + { + for (auto it = mono_fns.begin (); it != mono_fns.end (); it++) + { + std::pair<HirId, ::Bfunction *> &val = it->second; + const TyTy::BaseType *r = it->first; + if (ref->is_equal (*r)) + { + *fn = val.second; + + return true; + } + } + return false; + } + auto it = compiled_fn_map.find (id); if (it == compiled_fn_map.end ()) return false; @@ -282,6 +307,7 @@ private: std::vector< ::Bvariable *> loop_value_stack; std::vector< ::Blabel *> loop_begin_labels; std::map<const TyTy::BaseType *, std::pair<HirId, ::Btype *> > mono; + std::map<const TyTy::BaseType *, std::pair<HirId, ::Bfunction *> > mono_fns; // To GCC middle-end std::vector< ::Btype *> type_decls; |