Commit Graph

4079 Commits

Author SHA1 Message Date
Vassil Vassilev
0f1d6d24d4 Prepare for releasing cling v0.5. 2017-11-02 17:29:12 +01:00
Raphael Isemann
00a59858a5 Manually initialize the module manager before callbacks.
Initializing the module manager overwrites the external Sema/AST sources
with the ASTReader.

As we are using our own sources in cling, we should manually initalize
the module manager when we are in the module mode before we set our
own custom sources (which respect any existing sources like the ones
created by the module manager).
2017-11-02 10:10:48 +01:00
Raphael Isemann
016eaa7620 Prepone callback initialization in cling.
We should setup our callbacks for ExternalASTSource/ExternalSemaSource
before we parse *any* code to prevent that any part of the code
stores a reference to a non-cling external sources. If this happens,
then the clang data structures such redecl chain could go out of
sync if they reference different sources and produce errors like failing
to merge declarations correctly or creating invalid redecl chains.

To fix this, we move this initalization before the initalization of
the incremental parser which is the first part that can generate
any AST nodes. We only do this for the modules case because in
the non-modules case the clang PCH overwrites our callback
in the ExternalASTSource and therefore would destroy our external
source.
2017-11-02 10:10:48 +01:00
Raphael Isemann
d411ed7885 Enable interpreter callbacks again
We actually need those callbacks as they are responsible for
loading decls from unresolved identifiers, which then actually
triggers the loading of the specific header (or in our case
the specific C++ modules).

For now we need this as long as the modules are based on the
rootmap mechanism.
2017-11-02 10:10:48 +01:00
Raphael Isemann
a03e320a33 Revert "[cxxmodules] Prepone callback initialization in cling."
This reverts commit 62fc3e9eddc6c7e78c3becf60092143607cddf50.
2017-11-01 15:33:02 +01:00
Raphael Isemann
8165c1c800 Revert "[cxxmodules] Manually initialize the module manager before callbacks."
This reverts commit 6b3f5a1f04afff77089d39c905b29ce0a411d683.
2017-11-01 15:33:02 +01:00
Raphael Isemann
e20f8edbec Manually initialize the module manager before callbacks.
Initializing the module manager overwrites the external Sema/AST sources
with the ASTReader.

As we are using our own sources in cling, we should manually initalize
the module manager when we are in the module mode before we set our
own custom sources (which respect any existing sources like the ones
created by the module manager).
2017-11-01 15:33:02 +01:00
Raphael Isemann
1ebf53715c Prepone callback initialization in cling.
We should setup our callbacks for ExternalASTSource/ExternalSemaSource
before we parse *any* code to prevent that any part of the code
stores a reference to a non-cling external sources. If this happens,
then the clang data structures such redecl chain could go out of
sync if they reference different sources and produce errors like failing
to merge declarations correctly or creating invalid redecl chains.

To fix this, we move this initalization before the initalization of
the incremental parser which is the first part that can generate
any AST nodes.
2017-11-01 15:33:02 +01:00
Raphael Isemann
0f16f1ac15 Don't always generate a module in CIFactory
Right now we always start generating a module in the CIFactory
when modules are enabled. However, we should only do that when
we actually want to generate a module according to the COpts
(e.g. the user has given a module that we should generate).
2017-10-29 14:14:46 +01:00
Vassil Vassilev
8647fad06d Ask Sema if we enabled modules.
That fixes an issue when running hsimple.C with modules on.
2017-10-28 16:29:08 +02:00
Raphael Isemann
99d1df55ae Fix assert failure with duplicate decls.
When generating the GQt module in rootcling, we hit the assertions
in forceAppend assertions about "Duplicates?!" with this declaration:

```
CXXRecordDecl 0x55555643fae8 </usr/include/qt4/QtCore/qglobal.h:1658:1, line:1794:1> line:1658:21 in GQt.TGQt.h hidden class QSysInfo definition
|-also in GQt.TQtClientWidget.h
|-CXXRecordDecl 0x55555643fc30 <col:1, col:21> col:21 in GQt.TGQt.h hidden implicit class QSysInfo
|-AccessSpecDecl 0x55555643fce8 <line:1659:1, col:7> col:1 in GQt.TGQt.h public
|-EnumDecl 0x55555643fd18 <line:1660:5, line:1662:5> line:1660:10 in GQt.TGQt.h hidden Sizes
| `-EnumConstantDecl 0x55555643fe98 <line:1661:9, col:38> col:9 in GQt.TGQt.h hidden WordSize 'enum QSysInfo::Sizes'
|   `-ImplicitCastExpr 0x55555643fee0 <col:20, col:38> 'unsigned int' <IntegralCast>
|     `-ParenExpr 0x55555643fe70 <col:20, col:38> 'unsigned long'
|       `-BinaryOperator 0x55555643fe48 <col:21, col:37> 'unsigned long' '<<'
|         |-UnaryExprOrTypeTraitExpr 0x55555643fe08 <col:21, col:34> 'unsigned long' sizeof 'void *'
|         `-IntegerLiteral 0x55555643fe28 <col:37> 'int' 3
`-EnumDecl 0x55555643ff00 <line:1672:5, line:1685:5> line:1672:10 in GQt.TGQt.h hidden Endian
  |-EnumConstantDecl 0x55555643ffd8 <line:1673:9> col:9 in GQt.TGQt.h hidden referenced BigEndian 'enum QSysInfo::Endian'
  |-EnumConstantDecl 0x555556440028 <line:1674:9> col:9 in GQt.TGQt.h hidden referenced LittleEndian 'enum QSysInfo::Endian'
  `-EnumConstantDecl 0x5555564400a0 <line:1681:11, col:23> col:11 in GQt.TGQt.h hidden ByteOrder 'enum QSysInfo::Endian'
    `-ImplicitCastExpr 0x5555564400e8 <col:23> 'unsigned int' <IntegralCast>
      `-DeclRefExpr 0x555556440070 <col:23> 'int' EnumConstant 0x555556440028 'LittleEndian' 'enum QSysInfo::Endian'
```

The reason for this is that we have QSysInfo both in the TQtClientWidget
and TGQt submodules and our current translation (which is supposed to
parse all header in the module) sees them both in one transaction.

As we also don't recognize that this decl is from a module, the code
fires the assert even though duplictes are expected with modules.

The reason why we don't recognize it as a declaration form an ASTFile
which disables the assert is that FromASTFile for the decls is
not set. This is because they haven't been loaded by the ASTFileReader
but are directly parsed as submodules in our special case where we
directly parse a module content from rootcling to generate it.

We just workaround in this patch by checking that if the decl is from
the currently generated module, we are pretending it's as if it was
loaded from an AST file.
2017-10-27 10:52:41 +02:00
Danilo Piparo
f081e145e8 Revert "Revert 548eca7 to bring back optimisation level of interpreter to O0"
This reverts commit 79ed4963868c758757c25b7d93ef98fac0e34774.
The commit tried to bring back the optimisation level to O0 but 2 tests fail
if this is done:
- roottest-cling-specialobj-reread
- roottest-root-io-datamodelevolution-make
2017-10-19 21:14:24 +02:00
Danilo Piparo
fde4b32b7c Revert 548eca7 to bring back optimisation level of interpreter to O0
Revert https://github.com/root-project/root/commit/548eca7 bringing back
optimisation level to O0 given the very long time needed to JIT simple
pieces of code.
This takes tens of seconds versus a few seconds:

using namespace ROOT::Experimental;
int test() {
   // build a TDF with 1 event and 1 column "x" that is always equal 42
   TDataFrame dd(1);
   auto d = dd.Define("x", []() { return 42; });

   // book nHistos histograms
   // all with the same cut and filled with the same variable in this simple example
   std::vector<TDF::TResultProxy<TH1D>> histos;
   const auto nHistos = 1000u;
   histos.reserve(nHistos);
   for (auto i = 0u; i < nHistos; ++i)
      histos.emplace_back(d.Histo1D("x"));

   // run event loop, print something to be sure everything is ok
   std::cout << histos.front()->GetMean() << std::endl;
   return 0;
}
2017-10-19 19:28:42 +02:00
Bertrand Bellenot
f8d746464b Silent many warnings on Windows 2017-10-17 15:44:31 +02:00
Axel Naumann
b1e4381dd5 Use the result of find(). 2017-10-11 21:56:45 +02:00
Vassil Vassilev
2a4be7cd70 Simplify llvm::Module emission in the JIT.
This teaches again the IncrementalExecutor to emit only one module at a time.
In the old MCJIT days, the API worked with module sets and cling assumed llvm's
jit infrastructure is moving in this direction.

LLVM 5.0 moves away from this concept and works with single llvm::Modules. This
patch will make the upgrade to LLVM 5.0 smoother.
2017-10-10 18:32:58 +02:00
Vassil Vassilev
fca3ee5f64 Disable a little to restrictive assert.
We are not quite ready to control that precisely the ownership.
2017-10-05 22:31:07 +02:00
Bertrand Bellenot
6bfd18bbc4 formatting (clang-format) 2017-10-05 17:59:08 +02:00
Bertrand Bellenot
988e5b00f2 Fix the Visual Studio 2017 directory location (quick and dirty hack). To be reviewed
The Visual Studio 2017 path is very different than the previous versions, and even the registry entries are completely different, so for now let's try the trivial way first (using the %VCToolsInstallDir% environment variable)
2017-10-05 17:59:08 +02:00
Vassil Vassilev
dfc0e8a2d4 shared_ptr-ize the llvm::Module*.
This is in prepare for the upcoming llvm upgrade. The future orc jit compile
layer needs a std::shared_ptr<llvm::Module>. The current design passes a
llvm::Module* around and any conversions to a shared_ptr cause the
destruction of the llvm::Module which is a long-lived object in cling.
2017-10-05 17:59:08 +02:00
Vassil Vassilev
e409ca55bc Intent cling namespace content. 2017-10-05 17:59:08 +02:00
Raphael Isemann
b24a3f704c clang-formated ForwardDeclPrinter::prettyPrintAttributes 2017-10-02 11:27:19 +02:00
Raphael Isemann
5a45b2f93d Fix assert failure when printing fwd delcs
With C++ modules we fail here because we get this extra 'include '
text before the actual header. As the header itself is correct
it seems, we just skip this extra text with modules enabled as
this code is anyway supposed to be replaced with modules
functionality.
2017-10-02 11:27:19 +02:00
Raphael Isemann
016c1fd372 Use clang's method for checking if we are in std::* 2017-09-27 10:24:51 +02:00
Raphael Isemann
b7783cf7a9 Remove unnecessary assert
After some discussion with Axel we decided that there is no point to
assert here. This feature here is not related to C++ modules.
2017-09-25 10:29:21 +02:00
Danilo Piparo
6dbdd2ab18 Fix ROOT-8359: the first compiler we look for is the one the path
then the one that was used to build cling and finally the one
in the absolute path (e.g. usr/bin/g++)
2017-09-22 08:29:26 +02:00
Raphael Isemann
246ce867e6 Print stacktrace before aborting on a missing exception.
We will probably see an increasing amount of these failures with
C++ modules as we now deserialize all declarations instead of just
the PCH ones. To safe us a lot of debugging time on where to push
the needed transaction, let's directly print the stack trace here
in the rare case that we crash here.
2017-09-20 22:44:21 +02:00
Raphael Isemann
779e64646e Don't overrite the DeserializationListener.
With the module generation in rootcling Clang rlies on AST consumers
to do the module generation work for it. Right now this doesn't work
however with the interpreter, as we just overwrite the deserialization
listener that clang added which will cause strange errors during
the module generation (the most prompinent error is that the number
of recorded submodules will be incorrect, as this it the first thing
that Clang checks before writing a module and which is recorded by
an ASTDeserializationListener).

This patch just adds a multiplexer here that allows us to keep the
old listener while also adding the one we have.
2017-09-20 13:55:20 +02:00
Axel Naumann
e88b4a338b Use lambda to avoid default ction of Value (thanks, Philippe!) 2017-09-18 14:29:05 +02:00
Axel Naumann
48e0ed72fe Add note to future self on multiplexing synchonization callbacks. 2017-09-18 14:29:05 +02:00
Axel Naumann
f033d3024f RAII, not RTTI: rename class and #includes. 2017-09-18 14:29:05 +02:00
Axel Naumann
1cb22ab987 RAII, not RTTI: rename file. 2017-09-18 14:29:05 +02:00
Axel Naumann
363deeffa1 Use LockCompilationDuringUserCodeExecutionRAII when compiling during user code execution. 2017-09-18 14:29:05 +02:00
Axel Naumann
5a7c0d122c Add RAII for LockCompilationDuringUserCodeExecution. 2017-09-18 14:29:05 +02:00
Axel Naumann
f195e8f2fd Add (Un)LockCompilationDuringUserCodeExecution() callback. 2017-09-18 14:29:05 +02:00
Raphael Isemann
bfe05be443 Now configuring C++ modules in CIFactory on -fmodules.
This patch adds support for writing out modules to the CIFactory.
If the user has passed -fmodule-name and -fmodules, we start
extending the CI instance with support for C++ modules and also
optionally setup AST consumers for writing out modules files
alongside the interpreter.
2017-09-14 13:29:20 +02:00
Raphael Isemann
d9475011ca Extended InvocationOptions with C++ modules flags.
This makes it easier for cling to check if -fmodules and/or
-fmodule-name is passed so that we can act on these flags in the
CIFactory.
2017-09-14 13:29:20 +02:00
Axel Naumann
9f6e4d0ba0 Add test for "Also recognize templates as identifier." 2017-09-13 18:38:18 +02:00
Axel Naumann
eaa02cc638 Missing return statement! 2017-09-13 18:00:09 +02:00
Frederich Munch
da655d2e8e TextInput: Remove unused method. 2017-09-13 17:16:13 +02:00
Axel Naumann
bb161feccb Also recognize templates as identifier. 2017-09-13 17:14:08 +02:00
Axel Naumann
7f105f4ad5 Assume valid pointers for declare(). 2017-09-13 13:14:06 +02:00
Axel Naumann
89a7a1ead0 Only disable ptr checker, not all AST transformers! 2017-09-13 13:14:06 +02:00
Axel Naumann
5baa770702 Throw an interpreter exception when encountering a dynamic expression error.
Without throwing cling cannot communicate to the caller that the code has failed,
as the user code is currently running when failing the dynamic expression evaluation.
Fixes gROOT->ProcessLine("doesNotExist", &res) not signalling any error through res.
Well, it still does not set res to an error - but at least it now throws.
2017-09-13 13:03:03 +02:00
Axel Naumann
54c413fc2f Remove stray "$". 2017-09-12 15:00:15 +02:00
Axel Naumann
f621b9eff4 Use CLING_VERSION as PROJECT_NUMBER (and thus $projectnumber in footer). 2017-09-10 21:14:11 +02:00
Axel Naumann
8b37b14dc0 Use PROJECT_NUMBER as "revision" info. 2017-09-10 21:14:11 +02:00
Axel Naumann
27bc8a0e1c Follow doxygen.cfg from clang; fixes long paths in file mentions. 2017-09-10 21:14:11 +02:00
Raphael Isemann
84e413a1cb Use unique_ptr to better display ownership in CIFactory::createCI. 2017-09-10 13:59:13 +02:00
Yuki Yamaura
38923cd710 Add support C++1z for Jupyter kernel
When run C++17 kernel in Jupyter notebook cause some errors
due to currently clang-5.0 in https://root.cern.ch/download/cling/ is not
support c++17.
So add support to C++1z for Jupyter kernel and we can try some new
features in Jupyter notebook.

for avoiding following error:

[I 05:46:38.253 NotebookApp] Kernel restarted:
d3413fa0-7046-4b63-912b-a286610eacc1
error: invalid value 'c++17' in '-std=c++17'
note: use 'c++98' or 'c++03' for 'ISO C++ 1998 with amendments' standard
note: use 'gnu++98' or 'gnu++03' for 'ISO C++ 1998 with amendments and
GNU extensions' standard
note: use 'c++11' for 'ISO C++ 2011 with amendments' standard
note: use 'gnu++11' for 'ISO C++ 2011 with amendments and GNU
extensions' standard
note: use 'c++14' for 'ISO C++ 2014 with amendments' standard
note: use 'gnu++14' for 'ISO C++ 2014 with amendments and GNU
extensions' standard
note: use 'c++1z' for 'Working draft for ISO C++ 2017' standard
note: use 'gnu++1z' for 'Working draft for ISO C++ 2017 with GNU
extensions' standard
2017-09-06 16:44:07 +02:00