Commit Graph

346 Commits

Author SHA1 Message Date
Richard Smith b388a34bdd [modules] When reading / writing a typedef that is a name for linkage for
another declaration, ensure we actually serialize / deserialize that
declaration.

Before this patch, if another copy of the typedef were merged with the parsed
version, we would emit type information referring to the merged version and
consequently emit nothing about the parsed anonymous struct. This resulted in
us losing information, particularly the visible merged module set for the
parsed definition. Force that information to be emitted and to be loaded when
the typedef is used.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@293219 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-26 22:39:55 +00:00
Reid Kleckner 2930cafbf3 Serialize the UsesSEH bit on FunctionDecl
Fixes PR31539

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@291600 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-10 21:27:03 +00:00
David Blaikie d3ccc219f9 Fix for LLVM Bitcode API change (to use std::shared_ptr)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@291018 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-04 22:36:43 +00:00
Richard Smith c8c1a1961a [c++1z] P0195R2: Support pack-expansion of using-declarations.
This change introduces UsingPackDecl as a marker for the set of UsingDecls
produced by pack expansion of a single (unresolved) using declaration. This is
not strictly necessary (we just need to be able to map from the original using
declaration to its expansions somehow), but it's useful to maintain the
invariant that each declaration reference instantiates to refer to one
declaration.

This is a re-commit of r290080 (reverted in r290092) with a fix for a
use-after-lifetime bug.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@290203 91177308-0d34-0410-b5e6-96231b3b80d8
2016-12-20 21:35:28 +00:00
Daniel Jasper 9932fa356f Revert "[c++1z] P0195R2: Support pack-expansion of using-declarations."
This reverts commit r290080 as it leads to many Clang crashes, e.g.:
http://lab.llvm.org:8011/builders/clang-cmake-aarch64-quick/builds/1814

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@290092 91177308-0d34-0410-b5e6-96231b3b80d8
2016-12-19 10:09:25 +00:00
Richard Smith 2c092257ce [c++1z] P0195R2: Support pack-expansion of using-declarations.
This change introduces UsingPackDecl as a marker for the set of UsingDecls
produced by pack expansion of a single (unresolved) using declaration. This is
not strictly necessary (we just need to be able to map from the original using
declaration to its expansions somehow), but it's useful to maintain the
invariant that each declaration reference instantiates to refer to one
declaration.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@290080 91177308-0d34-0410-b5e6-96231b3b80d8
2016-12-19 04:08:53 +00:00
Richard Smith 5b36200c3d Reinstate r284008 reverted in r284081, with two fixes:
1) Merge and demote variable definitions when we find a redefinition in
MergeVarDecls, not only when we find one in AddInitializerToDecl (we only reach
the second case if it's the addition of the initializer itself that converts an
existing declaration into a definition). 

2) When rebuilding a redeclaration chain for a variable, if we merge two
definitions together, mark the definitions as merged so the retained definition
is made visible whenever the demoted definition would have been.

Original commit message (from r283882):

[modules] PR28752: Do not instantiate variable declarations which are not visible.

Original patch by Vassil Vassilev! Changes listed above are mine.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@284284 91177308-0d34-0410-b5e6-96231b3b80d8
2016-10-14 21:41:24 +00:00
Richard Smith c2d4c5ae67 Revert r284008. This is us to fail to instantiate static data members in some
cases. I'm working on reducing a testcase.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@284081 91177308-0d34-0410-b5e6-96231b3b80d8
2016-10-12 23:29:02 +00:00
Vassil Vassilev 4a6c659a27 Reinstate r283887 and r283882.
Original message:
"[modules] PR28752: Do not instantiate variable declarations which are not visible.

https://reviews.llvm.org/D24508

Patch developed in collaboration with Richard Smith!"


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@284008 91177308-0d34-0410-b5e6-96231b3b80d8
2016-10-12 11:57:08 +00:00
Vassil Vassilev 0fff40d646 Revert r283887 and r283882, until the issue is understood and fixed.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@283890 91177308-0d34-0410-b5e6-96231b3b80d8
2016-10-11 15:51:06 +00:00
Vassil Vassilev 079f316340 [modules] PR28752: Do not instantiate variable declarations which are not visible.
https://reviews.llvm.org/D24508

Patch developed in collaboration with Richard Smith!


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@283882 91177308-0d34-0410-b5e6-96231b3b80d8
2016-10-11 13:57:36 +00:00
Vassil Vassilev ed853c6e6b [modules] Allow VarDecls with initializers to use special var abbrev.
Update storage sizes to fit the (past) changes in the VarDecl's data model.
Update some comments.

Patch partially reviewed by Richard Smith as part of https://reviews.llvm.org/D24508


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@283444 91177308-0d34-0410-b5e6-96231b3b80d8
2016-10-06 13:04:54 +00:00
Richard Smith e32e1d11d7 C++ Modules TS: Add parsing and some semantic analysis support for
export-declarations. These don't yet have an effect on name visibility;
we still export everything by default.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@280999 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-08 23:14:54 +00:00
Richard Smith bcd0b9f902 P0217R3: serialization/deserialization support for c++17 decomposition declarations.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@278460 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-12 02:21:25 +00:00
Richard Smith 3b75c09ec6 [modules] Don't emit initializers for VarDecls within a module eagerly whenever
we first touch any part of that module. Instead, defer them until the first
time that module is (transitively) imported. The initializer step for a module
then recursively initializes modules that its own headers imported.

For example, this avoids running the <iostream> global initializer in programs
that don't actually use iostreams, but do use other parts of the standard
library.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@276159 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-20 19:10:16 +00:00
Mehdi Amini 2e23251d3e [NFC] Header cleanup
Summary: Removed unused headers, replaced some headers with forward class declarations

Patch by: Eugene <claprix@yandex.ru>

Differential Revision: https://reviews.llvm.org/D20100

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@275882 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-18 19:02:11 +00:00
Richard Smith 97fe2e8a4f Revert r275481, r275490. This broke modules bootstrap.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@275624 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-15 21:33:46 +00:00
Argyrios Kyrtzidis 753944f521 [AST] Keep track of the left brace source location of a tag decl.
This is useful for source modification tools. There will be a follow-up commit using it.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@275590 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-15 18:11:33 +00:00
Richard Smith 60c99da8ab [modules] Don't pass interesting decls to the consumer for a module file that's
passed on the command line but never actually used. We consider a (top-level)
module to be used if any part of it is imported, either by the current
translation unit, or by any part of a top-level module that is itself used.

(Put another way, a module is used if an implicit modules build would have
loaded its .pcm file.)


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@275481 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-14 21:50:09 +00:00
Richard Smith 5be817d9f9 P0136R1, DR1573, DR1645, DR1715, DR1736, DR1903, DR1941, DR1959, DR1991:
Replace inheriting constructors implementation with new approach, voted into
C++ last year as a DR against C++11.

Instead of synthesizing a set of derived class constructors for each inherited
base class constructor, we make the constructors of the base class visible to
constructor lookup in the derived class, using the normal rules for
using-declarations.

For constructors, UsingShadowDecl now has a ConstructorUsingShadowDecl derived
class that tracks the requisite additional information. We create shadow
constructors (not found by name lookup) in the derived class to model the
actual initialization, and have a new expression node,
CXXInheritedCtorInitExpr, to model the initialization of a base class from such
a constructor. (This initialization is special because it performs real perfect
forwarding of arguments.)

In cases where argument forwarding is not possible (for inalloca calls,
variadic calls, and calls with callee parameter cleanup), the shadow inheriting
constructor is not emitted and instead we directly emit the initialization code
into the caller of the inherited constructor.

Note that this new model is not perfectly compatible with the old model in some
corner cases. In particular:
 * if B inherits a private constructor from A, and C uses that constructor to
   construct a B, then we previously required that A befriends B and B
   befriends C, but the new rules require A to befriend C directly, and
 * if a derived class has its own constructors (and so its implicit default
   constructor is suppressed), it may still inherit a default constructor from
   a base class


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@274049 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-28 19:03:57 +00:00
Richard Smith 3c1c202ada Implement C++17 P0386R2, inline variables. (The 'inline' specifier gives a
variable weak discardable linkage and partially-ordered initialization, and is
implied for constexpr static data members.)


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@273754 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-25 00:15:56 +00:00
David Majnemer 21f6189c29 Use even more ArrayRefs
No functional change is intended, just a small refactoring.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@273650 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-24 05:33:44 +00:00
David Majnemer ba5c7ce848 Use more ArrayRefs
No functional change is intended, just a small refactoring.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@273647 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-24 04:05:48 +00:00
Vassil Vassilev 04e9aecb64 Reland r267691 fixing PR27535.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@267882 91177308-0d34-0410-b5e6-96231b3b80d8
2016-04-28 14:13:28 +00:00
Nico Weber 13781e3781 Revert r267691, it caused PR27535.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@267744 91177308-0d34-0410-b5e6-96231b3b80d8
2016-04-27 17:26:08 +00:00
Vassil Vassilev ff118bbb13 [modules] Fix Decl's Used invariant.
The Decl::isUsed has a value for every decl. In non-module builds it is very
difficult (but possible) to break this invariant but when we walk up the redecl
chain we find the neccessary information.

When deserializing the decls from a module it is much more difficult to update
correctly this invariant. The patch centralizes the information whether a decl
is used in the canonical decl marking the entire entity as being used.

Fixes https://llvm.org/bugs/show_bug.cgi?id=27401

Patch by Cristina Cristescu and me.

Thanks to Richard Smith who helped to debug and understand the issue!

Reviewed by Richard Smith.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@267691 91177308-0d34-0410-b5e6-96231b3b80d8
2016-04-27 10:46:06 +00:00
Richard Smith e1d7b3bd4c [modules] Remove CXX_BASE_SPECIFIERS_OFFSETS table. Instead of storing an ID of
a table entry in the corresponding decl, store an offset from the current
record to the relevant CXX_BASE_SPECIFIERS record. This results in fewer
indirections and a minor .pcm file size reduction.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@266266 91177308-0d34-0410-b5e6-96231b3b80d8
2016-04-14 00:29:55 +00:00
Richard Smith 7341605a7a [modules] Remove CXX_CTOR_INITIALIZERS_OFFSETS table. Instead of storing an ID
of a table entry in the corresponding decl, store an offset from the current
record to the relevant CXX_CTOR_INITIALIZERS record. This results in fewer
indirections and a minor .pcm file size reduction.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@266254 91177308-0d34-0410-b5e6-96231b3b80d8
2016-04-13 21:57:08 +00:00
NAKAMURA Takumi d067164e58 ASTWriterDecl.cpp: Prune a couple of \param(s), corresponding to r266160. [-Wdocumentation]
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@266177 91177308-0d34-0410-b5e6-96231b3b80d8
2016-04-13 07:45:10 +00:00
Richard Smith c11ded1da6 [modules] Refactor handling of cases where we write an offset to a prior record into the bitstream and simplify a little, in preparation for doing this in more cases.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@266160 91177308-0d34-0410-b5e6-96231b3b80d8
2016-04-13 02:12:03 +00:00
Richard Smith d219eda33d Minor simplifications.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@265594 91177308-0d34-0410-b5e6-96231b3b80d8
2016-04-06 20:12:34 +00:00
Richard Smith 017686a228 Re-commit r265518 ("[modules] Continue factoring encoding of AST records out of
ASTWriter."), reverted in r265526, with a fix for an iterator invalidation bug
(thanks, MSan!).


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@265564 91177308-0d34-0410-b5e6-96231b3b80d8
2016-04-06 17:06:00 +00:00
Dmitry Polukhin 6b41e0a310 [OPENMP] Parsing and Sema support for 'omp declare target' directive
Add parsing, sema analysis for 'declare target' construct for OpenMP 4.0
(4.5 support will be added in separate patch).

The declare target directive specifies that variables, functions (C, C++
and Fortran), and subroutines (Fortran) are mapped to a device. The declare
target directive is a declarative directive. In Clang declare target is
implemented as implicit attribute for the declaration.

The syntax of the declare target directive is as follows:

 #pragma omp declare target
 declarations-definition-seq
 #pragma omp end declare target

Based on patch from Michael Wong http://reviews.llvm.org/D15321

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@265530 91177308-0d34-0410-b5e6-96231b3b80d8
2016-04-06 11:38:59 +00:00
Dmitry Polukhin 4efb19c4af Revert "[modules] Continue factoring encoding of AST records out of ASTWriter."
This reverts commit r265518.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@265526 91177308-0d34-0410-b5e6-96231b3b80d8
2016-04-06 10:01:46 +00:00
Richard Smith e8c1d1f15d [modules] Continue factoring encoding of AST records out of ASTWriter.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@265518 91177308-0d34-0410-b5e6-96231b3b80d8
2016-04-06 06:26:08 +00:00
Richard Smith dc68861b86 [modules] Start moving the code for encoding AST records out of ASTWriter into
a separate class. The goal is for this class to have a separate lifetime from
the AST writer so that it can meaningfully track pending statement nodes and
context for more compact encoding of various types.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@265195 91177308-0d34-0410-b5e6-96231b3b80d8
2016-04-01 22:52:03 +00:00
Richard Smith b9331bdc50 Remove unused support for replacing declarations from chained AST files.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@264533 91177308-0d34-0410-b5e6-96231b3b80d8
2016-03-27 05:52:25 +00:00
Richard Smith 1c5e90201e [modules] Store a local offset to DeclContext lexical and visible contents. Saves a few bytes for each primary DeclContext.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@264377 91177308-0d34-0410-b5e6-96231b3b80d8
2016-03-25 01:17:43 +00:00
Richard Smith 983ec19c42 [modules] Store offset to LOCAL_REDECLARATIONS record relative to the current
record rather than relative to the start of the bitcode file. Saves a couple of
bytes per LOCAL_REDECLARATIONS record (also makes diffs of llvm-bcanalyzer
output more useful when tracking down nondeterminism...).


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@264359 91177308-0d34-0410-b5e6-96231b3b80d8
2016-03-24 23:41:14 +00:00
Alexey Bataev a6da6f0f08 [OPENMP 4.0] Codegen for 'declare reduction' construct.
Emit function for 'combiner' part of 'declare reduction' construct and
'initialilzer' part, if any.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@262699 91177308-0d34-0410-b5e6-96231b3b80d8
2016-03-04 09:22:22 +00:00
Alexey Bataev 4ee889aa07 [OPENMP 4.0] Initial support for 'omp declare reduction' construct.
Add parsing, sema analysis and serialization/deserialization for 'declare reduction' construct.
User-defined reductions are defined as

#pragma omp declare reduction( reduction-identifier : typename-list : combiner ) [initializer ( initializer-expr )]
These custom reductions may be used in 'reduction' clauses of OpenMP constructs. The combiner specifies how partial results can be combined into a single value. The
combiner can use the special variable identifiers omp_in and omp_out that are of the type of the variables being reduced with this reduction-identifier. Each of them will
denote one of the values to be combined before executing the combiner. It is assumed that the special omp_out identifier will refer to the storage that holds the resulting
combined value after executing the combiner.
As the initializer-expr value of a user-defined reduction is not known a priori the initializer-clause can be used to specify one. Then the contents of the initializer-clause
will be used as the initializer for private copies of reduction list items where the omp_priv identifier will refer to the storage to be initialized. The special identifier
omp_orig can also appear in the initializer-clause and it will refer to the storage of the original variable to be reduced.
Differential Revision: http://reviews.llvm.org/D11182


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@262582 91177308-0d34-0410-b5e6-96231b3b80d8
2016-03-03 05:21:39 +00:00
Nico Weber 5493a10248 Serialize `#pragma detect_mismatch`.
This is like r262493, but for pragma detect_mismatch instead of pragma comment.
The two pragmas have similar behavior, so use the same approach for both.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@262506 91177308-0d34-0410-b5e6-96231b3b80d8
2016-03-02 19:28:54 +00:00
Nico Weber 5a333e954b Serialize `#pragma comment`.
`#pragma comment` was handled by Sema calling a function on ASTConsumer, and
CodeGen then implementing this function and writing things to its output.

Instead, introduce a PragmaCommentDecl AST node and hang one off the
TranslationUnitDecl for every `#pragma comment` line, and then use the regular
serialization machinery. (Since PragmaCommentDecl has codegen relevance, it's
eagerly deserialized.)

http://reviews.llvm.org/D17799


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@262493 91177308-0d34-0410-b5e6-96231b3b80d8
2016-03-02 17:28:48 +00:00
Richard Smith e639f9c8bb PR26237: Fix iterator invalidation bug that occurs if serializing
specializations of a template manages to trigger deserialization of more
specializations of the same template.

No test case provided: this is hard to reliably test due to standard library
differences.

Patch by Vassil Vassilev!


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@261781 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-24 21:59:10 +00:00
Alexey Bataev 88bdfe9cef [OPENMP] Rename OMPCapturedFieldDecl to OMPCapturedExprDecl, NFC.
OMPCapturedExprDecl allows caopturing not only of fielddecls, but also
other expressions. It also allows to simplify codegen for several
clauses.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@260492 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-11 05:35:55 +00:00
Alexey Bataev 23f04132c7 [OPENMP 4.5] Ccapture/codegen of private non-static data members.
OpenMP 4.5 introduces privatization of non-static data members of current class in non-static member functions.
To correctly handle such kind of privatization a new (pseudo)declaration VarDecl-based node is added. It allows to reuse an existing code for capturing variables in Lambdas/Block/Captured blocks of code for correct privatization and codegen.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@260077 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-08 09:29:13 +00:00
Aaron Ballman 567d365030 Properly track that a character literal is UTF-8, and pretty print the prefix properly.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@257097 91177308-0d34-0410-b5e6-96231b3b80d8
2016-01-07 20:59:26 +00:00
Richard Smith 0a3c222032 [modules] If the semantic and lexical DC of a decl are the same, write out the
second one as 0 instead of writing the same bits to the module file twice.
This typically reduces PCM file size by about 1%.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@255384 91177308-0d34-0410-b5e6-96231b3b80d8
2015-12-11 22:41:00 +00:00
Douglas Gregor 9a3185dd71 Eliminate "rewritten decls" from the AST writer. NFC
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@251877 91177308-0d34-0410-b5e6-96231b3b80d8
2015-11-03 01:20:54 +00:00
Nick Lewycky 7cbe6ab3dc No functionality change, just fix whitespace, a typo and remove an unnecessary
emacs mode marker. (Changes left behind from another patch that ended up not
working out.)


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@250666 91177308-0d34-0410-b5e6-96231b3b80d8
2015-10-18 20:32:12 +00:00