diff options
author | David Blaikie <dblaikie@gmail.com> | 2017-04-11 20:46:34 +0000 |
---|---|---|
committer | David Blaikie <dblaikie@gmail.com> | 2017-04-11 20:46:34 +0000 |
commit | e6b7c28d17edf428c58ba65c549109c0a488a5be (patch) | |
tree | 115d3d7e4aea8682ad3d56bb219c1bcfafa84eda /clang/test/Modules/Inputs/codegen | |
parent | 4c54fe0c7bf8cc513509b488252d3e3f74958665 (diff) | |
download | bcm5719-llvm-e6b7c28d17edf428c58ba65c549109c0a488a5be.tar.gz bcm5719-llvm-e6b7c28d17edf428c58ba65c549109c0a488a5be.zip |
Modular Codegen: Add/use a bit in serialized function definitions to track whether they are the subject of modular codegen
Some decls are created not where they are written, but in other module
files/users (implicit special members and function template implicit
specializations). To correctly identify them, use a bit next to the definition
to track the modular codegen property.
Discussed whether the module file bit could be omitted in favor of
reconstituting from the modular codegen decls list - best guess today is that
the efficiency improvement of not having to deserialize the whole list whenever
any function is queried by a module user is worth it for the small size
increase of this redundant (list + bit-on-def) representation.
Reviewers: rsmith
Differential Revision: https://reviews.llvm.org/D29901
llvm-svn: 299982
Diffstat (limited to 'clang/test/Modules/Inputs/codegen')
-rw-r--r-- | clang/test/Modules/Inputs/codegen/foo.h | 26 | ||||
-rw-r--r-- | clang/test/Modules/Inputs/codegen/use.cpp | 8 |
2 files changed, 34 insertions, 0 deletions
diff --git a/clang/test/Modules/Inputs/codegen/foo.h b/clang/test/Modules/Inputs/codegen/foo.h index 3fcab718573..e77e8d1824e 100644 --- a/clang/test/Modules/Inputs/codegen/foo.h +++ b/clang/test/Modules/Inputs/codegen/foo.h @@ -2,3 +2,29 @@ inline void f1(const char* fmt, ...) { __builtin_va_list args; __builtin_va_start(args, fmt); } + +struct non_trivial_dtor { + ~non_trivial_dtor(); +}; + +struct implicit_dtor { + non_trivial_dtor d; +}; + +struct uninst_implicit_dtor { + non_trivial_dtor d; +}; + +inline void use_implicit_dtor() { + implicit_dtor d; +} + +template <typename T> +void inst() { +} + +inline void inst_decl() { + // cause inst<int>'s declaration to be instantiated, without a definition. + (void)sizeof(&inst<int>); + inst<float>(); +} diff --git a/clang/test/Modules/Inputs/codegen/use.cpp b/clang/test/Modules/Inputs/codegen/use.cpp new file mode 100644 index 00000000000..cd1a4a642d0 --- /dev/null +++ b/clang/test/Modules/Inputs/codegen/use.cpp @@ -0,0 +1,8 @@ +#include "foo.h" +void non_modular_use_of_implicit_dtor() { + implicit_dtor d1; + uninst_implicit_dtor d2; +} +void use_of_instantiated_declaration_without_definition() { + inst<int>(); +} |