diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2020-05-22 11:34:19 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2020-05-22 11:34:19 +0200 |
commit | f352dbb8308ddeab5fa47a5d18883f854192ec53 (patch) | |
tree | 17bf76b6acf13711049cc54aa3948df6b27db3f6 | |
parent | 630b498533f5a9a1e9d40893f4806ef855f1e03b (diff) |
Make template definition available in all translation units where used
We were trying to be clever but GCC 10's IPA-SRA optimization didn't like it.
-rw-r--r-- | libbuild2/bin/init.cxx | 2 | ||||
-rw-r--r-- | libbuild2/bin/rule.cxx | 2 | ||||
-rw-r--r-- | libbuild2/cc/common.cxx | 27 | ||||
-rw-r--r-- | libbuild2/cc/common.hxx | 4 | ||||
-rw-r--r-- | libbuild2/cc/common.txx | 35 |
5 files changed, 40 insertions, 30 deletions
diff --git a/libbuild2/bin/init.cxx b/libbuild2/bin/init.cxx index 34bfcd7..4af3c1d 100644 --- a/libbuild2/bin/init.cxx +++ b/libbuild2/bin/init.cxx @@ -1,4 +1,4 @@ -// file : build2/bin/init.cxx -*- C++ -*- +// file : libbuild2/bin/init.cxx -*- C++ -*- // license : MIT; see accompanying LICENSE file #include <libbuild2/bin/init.hxx> diff --git a/libbuild2/bin/rule.cxx b/libbuild2/bin/rule.cxx index e6f234a..a2cdf8c 100644 --- a/libbuild2/bin/rule.cxx +++ b/libbuild2/bin/rule.cxx @@ -1,4 +1,4 @@ -// file : build2/bin/rule.cxx -*- C++ -*- +// file : libbuild2/bin/rule.cxx -*- C++ -*- // license : MIT; see accompanying LICENSE file #include <libbuild2/bin/rule.hxx> diff --git a/libbuild2/cc/common.cxx b/libbuild2/cc/common.cxx index 6bd9ac3..8150cfa 100644 --- a/libbuild2/cc/common.cxx +++ b/libbuild2/cc/common.cxx @@ -487,33 +487,6 @@ namespace build2 return xt->as<file> (); } - // Insert a target "tagging" it with the specified process path and - // verifying that it already exists if requested. Return the lock. - // - template <typename T> - ulock common:: - insert_library (context& ctx, - T*& r, - string name, - dir_path dir, - const process_path& out, - optional<string> ext, - bool exist, - tracer& trace) - { - auto p (ctx.targets.insert_locked (T::static_type, - move (dir), - path_cast<dir_path> (out.effect), - name, - move (ext), - true, // Implied. - trace)); - - assert (!exist || !p.second.owns_lock ()); - r = &p.first.template as<T> (); - return move (p.second); - } - // Note that pk's scope should not be NULL (even if dir is absolute). // target* common:: diff --git a/libbuild2/cc/common.hxx b/libbuild2/cc/common.hxx index 422b761..b47f225 100644 --- a/libbuild2/cc/common.hxx +++ b/libbuild2/cc/common.hxx @@ -1,4 +1,4 @@ -// file : build2/cc/common.hxx -*- C++ -*- +// file : libbuild2/cc/common.hxx -*- C++ -*- // license : MIT; see accompanying LICENSE file #ifndef LIBBUILD2_CC_COMMON_HXX @@ -382,4 +382,6 @@ namespace build2 } } +#include <libbuild2/cc/common.hxx> + #endif // LIBBUILD2_CC_COMMON_HXX diff --git a/libbuild2/cc/common.txx b/libbuild2/cc/common.txx new file mode 100644 index 0000000..bfbc52c --- /dev/null +++ b/libbuild2/cc/common.txx @@ -0,0 +1,35 @@ +// file : libbuild2/cc/common.txx -*- C++ -*- +// license : MIT; see accompanying LICENSE file + +namespace build2 +{ + namespace cc + { + // Insert a target "tagging" it with the specified process path and + // verifying that it already exists if requested. Return the lock. + // + template <typename T> + ulock common:: + insert_library (context& ctx, + T*& r, + string name, + dir_path dir, + const process_path& out, + optional<string> ext, + bool exist, + tracer& trace) + { + auto p (ctx.targets.insert_locked (T::static_type, + move (dir), + path_cast<dir_path> (out.effect), + name, + move (ext), + true, // Implied. + trace)); + + assert (!exist || !p.second.owns_lock ()); + r = &p.first.template as<T> (); + return move (p.second); + } + } +} |