59 #include "RConfigure.h" 60 #include "compiledata.h" 76 #include "clang/AST/ASTContext.h" 77 #include "clang/AST/Decl.h" 78 #include "clang/AST/DeclarationName.h" 79 #include "clang/AST/GlobalDecl.h" 80 #include "clang/AST/RecordLayout.h" 81 #include "clang/AST/RecursiveASTVisitor.h" 82 #include "clang/AST/Type.h" 83 #include "clang/Basic/SourceLocation.h" 84 #include "clang/Basic/Specifiers.h" 85 #include "clang/Basic/TargetInfo.h" 86 #include "clang/CodeGen/ModuleBuilder.h" 87 #include "clang/Frontend/CompilerInstance.h" 88 #include "clang/Frontend/FrontendDiagnostic.h" 89 #include "clang/Lex/HeaderSearch.h" 90 #include "clang/Lex/Preprocessor.h" 91 #include "clang/Sema/Lookup.h" 92 #include "clang/Sema/Sema.h" 93 #include "clang/Parse/Parser.h" 95 #include "cling/Interpreter/ClangInternalState.h" 96 #include "cling/Interpreter/DynamicLibraryManager.h" 97 #include "cling/Interpreter/Interpreter.h" 98 #include "cling/Interpreter/LookupHelper.h" 99 #include "cling/Interpreter/Value.h" 100 #include "cling/Interpreter/Transaction.h" 101 #include "cling/MetaProcessor/MetaProcessor.h" 102 #include "cling/Utils/AST.h" 103 #include "cling/Utils/ParserStateRAII.h" 104 #include "cling/Utils/SourceNormalization.h" 105 #include "cling/Interpreter/Exception.h" 107 #include "llvm/IR/GlobalValue.h" 108 #include "llvm/IR/Module.h" 110 #include "llvm/Support/DynamicLibrary.h" 111 #include "llvm/Support/raw_ostream.h" 112 #include "llvm/Support/Path.h" 125 #include <unordered_map> 138 #include <mach-o/dyld.h> 139 #include <mach-o/loader.h> 146 #if defined(__CYGWIN__) 147 #include <sys/cygwin.h> 148 #define HMODULE void * 150 __declspec(dllimport)
void * __stdcall GetCurrentProcess();
151 __declspec(dllimport)
bool __stdcall EnumProcessModules(
void *,
void **,
unsigned long,
unsigned long *);
152 __declspec(dllimport)
unsigned long __stdcall GetModuleFileNameExW(
void *,
void *,
wchar_t *,
unsigned long);
157 #if defined(_MSC_VER) 159 # define STDIN_FILENO 0 161 #ifndef STDOUT_FILENO 162 # define STDOUT_FILENO 1 164 #ifndef STDERR_FILENO 165 # define STDERR_FILENO 2 174 #undef GetModuleFileName 175 #define RTLD_DEFAULT ((void *)::GetModuleHandle(NULL)) 176 #define dlsym(library, function_name) ::GetProcAddress((HMODULE)library, function_name) 177 #define dlopen(library_name, flags) ::LoadLibrary(library_name) 178 #define dlclose(library) ::FreeLibrary((HMODULE)library) 179 #define R__DLLEXPORT __declspec(dllexport) 187 class TCling_UnloadMarker {
189 ~TCling_UnloadMarker() {
195 static TCling_UnloadMarker gTClingUnloadMarker;
204 return D->getDeclContext();
207 return llvm::dyn_cast<clang::NamespaceDecl>(DC);
210 return llvm::dyn_cast<clang::RecordDecl>(DC);
213 return DC->dumpDeclContext();
222 return ((clang::Decl*)D)->dump();
225 if (clang::NamedDecl* ND = llvm::dyn_cast<clang::NamedDecl>(D)) {
228 llvm::raw_string_ostream OS(name);
229 ND->getNameForDiagnostic(OS, D->getASTContext().getPrintingPolicy(),
232 printf(
"%s\n", name.c_str());
240 return D->isInvalidDecl();
244 assert(info && info->
IsValid());
245 return info->
GetDecl()->isInvalidDecl();
249 using namespace clang;
250 using namespace ROOT;
253 static const std::string gInterpreterClassDef = R
"ICF( 255 #define ClassDef(name, id) \ 256 _ClassDefInterp_(name,id,virtual,) \ 257 static int DeclFileLine() { return __LINE__; } 259 #define ClassDefNV(name, id) \ 260 _ClassDefInterp_(name,id,,) \ 261 static int DeclFileLine() { return __LINE__; } 262 #undef ClassDefOverride 263 #define ClassDefOverride(name, id) \ 264 _ClassDefInterp_(name,id,,override) \ 265 static int DeclFileLine() { return __LINE__; } 268 static const std::string gNonInterpreterClassDef = R
"ICF( 269 #define __ROOTCLING__ 1 271 #define ClassDef(name,id) \ 272 _ClassDef_(name,id,virtual,) \ 273 static int DeclFileLine() { return __LINE__; } 275 #define ClassDefNV(name, id)\ 276 _ClassDef_(name,id,,)\ 277 static int DeclFileLine() { return __LINE__; } 278 #undef ClassDefOverride 279 #define ClassDefOverride(name, id)\ 280 _ClassDef_(name,id,,override)\ 281 static int DeclFileLine() { return __LINE__; } 285 static const std::string gClassDefInterpMacro = R
"ICF( 290 #define _ClassDefInterp_(name,id,virtual_keyword, overrd) \ 293 static TClass *Class() { static TClass* sIsA = 0; if (!sIsA) sIsA = TClass::GetClass(#name); return sIsA; } \ 294 static const char *Class_Name() { return #name; } \ 295 static Version_t Class_Version() { return id; } \ 296 static TClass *Dictionary() { return 0; } \ 297 virtual_keyword TClass *IsA() const overrd { return name::Class(); } \ 298 virtual_keyword void ShowMembers(TMemberInspector&insp) const overrd { ::ROOT::Class_ShowMembers(name::Class(), this, insp); } \ 299 virtual_keyword void Streamer(TBuffer&) overrd { ::Error("Streamer", "Cannot stream interpreted class."); } \ 300 void StreamerNVirtual(TBuffer&ClassDef_StreamerNVirtual_b) { name::Streamer(ClassDef_StreamerNVirtual_b); } \ 301 static const char *DeclFileName() { return __FILE__; } \ 302 static int ImplFileLine() { return 0; } \ 303 static const char *ImplFileName() { return __FILE__; } 314 class EnumVisitor :
public RecursiveASTVisitor<EnumVisitor> {
316 llvm::SmallVector<EnumDecl*,128> &fClassEnums;
318 EnumVisitor(llvm::SmallVector<EnumDecl*,128> &enums) : fClassEnums(enums)
321 bool TraverseStmt(Stmt*) {
326 bool shouldVisitTemplateInstantiations()
const {
return true; }
328 bool TraverseClassTemplateDecl(ClassTemplateDecl*) {
333 bool TraverseClassTemplatePartialSpecializationDecl(ClassTemplatePartialSpecializationDecl*) {
338 bool VisitEnumDecl(EnumDecl *TEnumD) {
339 if (!TEnumD->getDeclContext()->isDependentContext())
340 fClassEnums.push_back(TEnumD);
359 static vector<const NamedDecl*> updateList;
362 if (entered) topLevel =
kFALSE;
377 updateList.push_back(TD);
380 while (!updateList.empty()) {
382 updateList.pop_back();
389 const clang::Decl* D =
static_cast<const clang::Decl*
>(enumObj->
GetDeclId());
390 if(
const clang::EnumDecl* ED = dyn_cast<clang::EnumDecl>(D)) {
392 for (EnumDecl::enumerator_iterator EDI = ED->enumerator_begin(),
393 EDE = ED->enumerator_end(); EDI != EDE; ++EDI) {
395 std::string constbuf;
396 if (
const NamedDecl* END = llvm::dyn_cast<NamedDecl>(*EDI)) {
397 PrintingPolicy Policy((*EDI)->getASTContext().getPrintingPolicy());
398 llvm::raw_string_ostream stream(constbuf);
400 Policy.AnonymousTagLocations =
false;
401 (END)->getNameForDiagnostic(stream, Policy,
false);
403 const char* constantName = constbuf.c_str();
407 const llvm::APSInt valAPSInt = (*EDI)->getInitVal();
408 if (valAPSInt.isSigned()) {
409 value = valAPSInt.getSExtValue();
411 value = valAPSInt.getZExtValue();
418 DataMemberInfo_t* dmInfo = (DataMemberInfo_t*) tcDmInfo;
422 enumConstant =
new TEnumConstant(dmInfo, constantName, value, enumObj);
429 globals->
Add(enumConstant);
442 const clang::Decl* D =
static_cast<const clang::Decl*
>(VD);
444 if (
const EnumDecl* ED = llvm::dyn_cast<EnumDecl>(D)) {
446 PrintingPolicy Policy(ED->getASTContext().getPrintingPolicy());
447 llvm::raw_string_ostream stream(buf);
449 Policy.AnonymousTagLocations =
false;
450 ED->getNameForDiagnostic(stream, Policy,
false);
456 const char*
name = buf.c_str();
457 enumType =
new TEnum(name, VD, cl);
458 UpdateEnumConstants(enumType, cl);
467 const clang::Decl* D =
static_cast<const clang::Decl*
>(DV);
469 if (!D->isCanonicalDecl() && !isa<clang::NamespaceDecl>(D)
470 && !dyn_cast<clang::RecordDecl>(D))
return;
472 if (isa<clang::FunctionDecl>(D->getDeclContext())
473 || isa<clang::TagDecl>(D->getDeclContext()))
477 if (
const clang::CXXRecordDecl* RD = dyn_cast<clang::CXXRecordDecl>(D)) {
478 if (RD->getDescribedClassTemplate())
480 }
else if (
const clang::FunctionDecl* FD = dyn_cast<clang::FunctionDecl>(D)) {
481 if (FD->getDescribedFunctionTemplate())
485 if (
const RecordDecl *TD = dyn_cast<RecordDecl>(D)) {
486 if (TD->isCanonicalDecl() || TD->isThisDeclarationADefinition())
489 else if (
const NamedDecl *ND = dyn_cast<NamedDecl>(D)) {
491 if (
const TagDecl *TD = dyn_cast<TagDecl>(D)) {
495 }
else if (
const NamespaceDecl* NSD = dyn_cast<NamespaceDecl>(D)) {
503 if (
const NamespaceDecl* NCtx = dyn_cast<NamespaceDecl>(ND->getDeclContext())) {
504 if (NCtx->getIdentifier()) {
507 std::string NCtxName;
508 PrintingPolicy Policy(NCtx->getASTContext().getPrintingPolicy());
509 llvm::raw_string_ostream stream(NCtxName);
511 Policy.AnonymousTagLocations =
false;
512 NCtx->getNameForDiagnostic(stream, Policy,
true);
516 modifiedTClasses.insert(cl);
523 if (!isa<TranslationUnitDecl>(ND->getDeclContext()))
527 if (isa<EnumDecl>(ND))
532 if (!(isa<VarDecl>(ND)))
536 if (
gROOT->GetListOfGlobals()->FindObject(ND->getNameAsString().c_str()))
540 gROOT->GetListOfGlobals()->Add(
new TGlobal((DataMemberInfo_t *)
542 cast<ValueDecl>(ND), 0)));
569 const char* canonicalName) {
571 ((
TCling*)
gCling)->LibraryLoaded(dyLibHandle, canonicalName);
575 const char* canonicalName) {
577 ((
TCling*)
gCling)->LibraryUnloaded(dyLibHandle, canonicalName);
583 return ((
TCling*)
gCling)->GetObjectAddress(Name, LookupCtx);
592 cling::DynamicLibraryManager::ExposeHiddenSharedLibrarySymbols(interpLibHandle);
593 return new TCling(
"C++",
"cling C++ Interpreter");
615 return ((
TCling*)
gCling)->GetClassSharedLibs(className);
627 return ((
TCling*)
gCling)->IsAutoLoadNamespaceCandidate(nsDecl);
632 string file(fileName);
638 string &args,
string &io,
string &fname)
640 string file(fileName);
641 TString
f, amode, arguments, aclicio;
643 mode = amode.Data(); args = arguments.Data();
644 io = aclicio.Data(); fname = f.Data();
654 char *__unDName(
char *demangled,
const char *mangled,
int out_len,
655 void * (* pAlloc )(
size_t),
void (* pFree )(
void *),
656 unsigned short int flags);
668 using namespace clang;
669 if (NamespaceDecl* nsd = llvm::dyn_cast<NamespaceDecl>(decl)){
673 if (ClassTemplateDecl* ctd = llvm::dyn_cast<ClassTemplateDecl>(decl)){
685 return ((
TCling*)
gCling)->LazyFunctionCreatorAutoload(mangled_name);
694 const std::vector<std::string> &headers,
695 const std::vector<std::string> &fwdDecls,
696 const std::vector<std::string> &unknown)
702 if (classes.empty()) {
706 const std::string& className = classes[0];
708 TString fileName =
"AutoDict_";
709 std::string::const_iterator sIt;
710 for (sIt = className.begin(); sIt != className.end(); sIt++) {
711 if (*sIt ==
'<' || *sIt ==
'>' ||
712 *sIt ==
' ' || *sIt ==
'*' ||
713 *sIt ==
',' || *sIt ==
'&' ||
721 if (classes.size() > 1) {
723 std::vector<std::string>::const_iterator it = classes.begin();
724 while ((++it) != classes.end()) {
725 for (
UInt_t cursor = 0; cursor != it->length(); ++cursor) {
726 chk = chk * 3 + it->at(cursor);
739 static const std::set<std::string> sSTLTypes {
740 "vector",
"list",
"forward_list",
"deque",
"map",
"unordered_map",
"multimap",
741 "unordered_multimap",
"set",
"unordered_set",
"multiset",
"unordered_multiset",
742 "queue",
"priority_queue",
"stack",
"iterator"};
743 std::vector<std::string>::const_iterator it;
744 std::string fileContent(
"");
745 for (it = headers.begin(); it != headers.end(); ++it) {
746 fileContent +=
"#include \"" + *it +
"\"\n";
748 for (it = unknown.begin(); it != unknown.end(); ++it) {
754 while (dirbase.Length() && dirbase !=
"." 755 && dirbase !=
"include" && dirbase !=
"inc" 756 && dirbase !=
"prec_stl") {
760 fileContent += TString(
"#include \"") + header +
"\"\n";
763 for (it = fwdDecls.begin(); it != fwdDecls.end(); ++it) {
764 fileContent +=
"class " + *it +
";\n";
766 fileContent +=
"#ifdef __CINT__ \n";
767 fileContent +=
"#pragma link C++ nestedclasses;\n";
768 fileContent +=
"#pragma link C++ nestedtypedefs;\n";
769 for (it = classes.begin(); it != classes.end(); ++it) {
771 size_t posTemplate = n.find(
'<');
772 std::set<std::string>::const_iterator iSTLType = sSTLTypes.end();
773 if (posTemplate != std::string::npos) {
774 n.erase(posTemplate, std::string::npos);
775 if (n.compare(0, 5,
"std::") == 0) {
778 iSTLType = sSTLTypes.find(n);
780 fileContent +=
"#pragma link C++ class ";
781 fileContent += *it +
"+;\n" ;
782 fileContent +=
"#pragma link C++ class ";
783 if (iSTLType != sSTLTypes.end()) {
787 fileContent += *it +
"::*;\n" ;
792 fileContent += *it +
"::*+;\n" ;
794 std::string oprLink(
"#pragma link C++ operators ");
798 if (iSTLType != sSTLTypes.end()) {
800 fileContent +=
"#ifdef G__VECTOR_HAS_CLASS_ITERATOR\n";
802 fileContent += oprLink +
"::iterator;\n";
803 fileContent += oprLink +
"::const_iterator;\n";
804 fileContent += oprLink +
"::reverse_iterator;\n";
806 fileContent +=
"#endif\n";
810 fileContent +=
"#endif\n";
814 filePointer = fopen(fileName,
"w");
815 if (filePointer ==
NULL) {
821 fprintf(filePointer,
"%s", fileContent.c_str());
837 const std::vector<std::string> &headers,
838 const std::vector<std::string> &fwdDecls,
839 const std::vector<std::string> &unknown)
845 std::vector<std::string> classes;
846 classes.push_back(className);
874 void exceptionErrorHandler(
void * ,
875 const std::string& reason,
877 throw std::runtime_error(std::string(
">>> Interpreter compilation error:\n") + reason);
891 class clangDiagSuppr {
893 clangDiagSuppr(clang::DiagnosticsEngine& diag): fDiagEngine(diag){
894 fOldDiagValue = fDiagEngine.getIgnoreAllWarnings();
895 fDiagEngine.setIgnoreAllWarnings(
true);
899 fDiagEngine.setIgnoreAllWarnings(fOldDiagValue);
902 clang::DiagnosticsEngine& fDiagEngine;
924 unsigned long offset = 0;
925 if (strncmp(tname.c_str(),
"const ", 6) == 0) {
928 unsigned long end = tname.length();
929 while( end && (tname[end-1]==
'&' || tname[end-1]==
'*' || tname[end-1]==
']') ) {
930 if ( tname[end-1]==
']' ) {
932 while ( end && tname[end-1]!=
'[' ) --end;
936 std::string innerbuf;
938 if (end != tname.length()) {
939 innerbuf = tname.substr(offset,end-offset);
940 inner = innerbuf.c_str();
942 inner = tname.c_str()+offset;
946 if (
gROOT->GetListOfClasses()->FindObject(inner)
958 newname =
"Long64_t";
960 newname =
"ULong64_t";
962 if (strcmp(inner,newname) == 0) {
965 if (offset) result =
"const ";
967 if ( end != tname.length() ) {
968 result += tname.substr(end,tname.length()-end);
970 if (result == tname) result.clear();
976 if (lastPos != inner)
980 const auto enName = lastPos;
981 const auto scopeNameSize = ((
Long64_t)lastPos - (
Long64_t)inner) /
sizeof(decltype(*lastPos)) - 2;
982 char *scopeName =
new char[scopeNameSize + 1];
983 strncpy(scopeName, inner, scopeNameSize);
984 scopeName[scopeNameSize] =
'\0';
986 if (
auto scope = static_cast<TClass *>(
gROOT->GetListOfClasses()->FindObject(scopeName))) {
987 auto enumTable =
dynamic_cast<const THashList *
>(scope->GetListOfEnums(
false));
988 if (enumTable && enumTable->THashList::FindObject(enName))
return true;
992 auto listOfEnums = scope->GetListOfEnums();
994 auto enumTable =
dynamic_cast<const THashList *
>(listOfEnums);
995 if (enumTable && enumTable->THashList::FindObject(enName))
return true;
1002 auto enumTable =
dynamic_cast<const THashList *
>(
gROOT->GetListOfEnums());
1003 if (enumTable && enumTable->THashList::FindObject(inner))
return true;
1019 fContent.reserve(size);
1026 return fContent.c_str();
1034 bool notPresent = fLinesHashSet.emplace(fHashFunc(str)).second;
1045 :
TInterpreter(name, title), fGlobalsListSerial(-1), fInterpreter(0),
1046 fMetaProcessor(0), fNormalizedCtxt(0), fPrevLoadedDynLibInfo(0),
1047 fClingCallbacks(0), fAutoLoadCallBack(0),
1048 fTransactionCount(0), fHeaderParsingOnDemand(true), fIsAutoParsingSuspended(
kFALSE)
1051 bool fromRootCling = dlsym(RTLD_DEFAULT,
"usedToIdentifyRootClingByDlSym");
1053 llvm::install_fatal_error_handler(&exceptionErrorHandler);
1057 std::vector<std::string> clingArgsStorage;
1058 clingArgsStorage.push_back(
"cling4root");
1060 std::string interpInclude;
1062 if (!fromRootCling) {
1067 clingArgsStorage.push_back(interpInclude);
1072 clingArgsStorage.push_back(interpInclude +
"/cling");
1080 std::string pchFilename = interpInclude.substr(2) +
"/allDict.cxx.pch";
1084 clingArgsStorage.push_back(
"-include-pch");
1085 clingArgsStorage.push_back(pchFilename);
1090 clingArgsStorage.push_back(
"-Wno-undefined-inline");
1091 clingArgsStorage.push_back(
"-fsigned-char");
1094 std::vector<const char*> interpArgs;
1095 for (std::vector<std::string>::const_iterator iArg = clingArgsStorage.begin(),
1096 eArg = clingArgsStorage.end(); iArg != eArg; ++iArg)
1097 interpArgs.push_back(iArg->c_str());
1102 extraArgs && *extraArgs; ++extraArgs) {
1103 if (!strcmp(*extraArgs,
"-resource-dir")) {
1105 llvmResourceDir = *(++extraArgs);
1107 interpArgs.push_back(*extraArgs);
1111 fInterpreter =
new cling::Interpreter(interpArgs.size(),
1113 llvmResourceDir.c_str());
1115 if (!fromRootCling) {
1120 fInterpreter->getCI()->getPreprocessorOpts().DisablePCHValidation =
true;
1124 fInterpreter->getCI()->getLangOpts().SpellChecking =
false;
1130 static llvm::raw_fd_ostream fMPOuts (STDOUT_FILENO,
false);
1136 if (fromRootCling) {
1138 "#include <string>\n" 1139 "using std::string;");
1142 + gClassDefInterpMacro +
"\n" 1143 + gInterpreterClassDef +
"\n" 1144 +
"#undef ClassImp\n" 1145 "#define ClassImp(X)\n" 1146 "#include <string>\n" 1147 "using namespace std;");
1175 if (!fromRootCling) {
1182 std::unique_ptr<TClingCallbacks>
1205 #if defined(R__MUST_REVISIT) 1206 #if R__MUST_REVISIT(6,2) 1207 Warning(
"~TCling",
"Interface not available yet.");
1208 #ifdef R__COMPLETE_MEM_TERMINATION 1229 #if defined(__CYGWIN__) && defined(__GNUC__) 1231 #elif defined(G__WIN32) 1232 MEMORY_BASIC_INFORMATION mbi;
1233 if (!VirtualQuery (
func, &mbi,
sizeof (mbi)))
1238 HMODULE hMod = (HMODULE) mbi.AllocationBase;
1239 TTHREAD_TLS_ARRAY(
char, MAX_PATH, moduleName);
1241 if (!GetModuleFileNameA (hMod, moduleName,
sizeof (moduleName)))
1248 if (dladdr((
void*)
func,&info)==0) {
1253 return info.dli_fname;
1265 auto setFactory = []() {
1269 static bool doneFactory = setFactory();
1278 const char** headers,
1279 void (*triggerFunc)())
const {
1287 searchPath = llvm::sys::path::parent_path(libraryName);
1307 if (
gROOT->IsRootFile(pcmFileName)) {
1311 ::Info(
"TCling::LoadPCM",
"Loading ROOT PCM %s", pcmFileName.Data());
1318 TFile *pcmFile =
new TFile(pcmFileName+
"?filetype=pcm",
"READ");
1320 auto listOfKeys = pcmFile->GetListOfKeys();
1326 (listOfKeys->GetSize() == 0) ||
1328 (listOfKeys->GetSize() == 1) &&
1329 !strcmp(((
TKey*)listOfKeys->At(0))->
GetName(),
"EMPTY")
1340 ::Info(
"TCling::LoadPCM",
"reading protoclasses for %s \n",pcmFileName.Data());
1342 pcmFile->GetObject(
"__ProtoClasses", protoClasses);
1345 for (
auto obj : *protoClasses) {
1355 for (
auto proto : *protoClasses) {
1364 ::Error(
"TCling::LoadPCM",
"Inconsistent TClassTable for %s",
1376 protoClasses->Clear();
1377 delete protoClasses;
1381 pcmFile->GetObject(
"__Typedefs", dataTypes);
1383 for (
auto typedf: *dataTypes)
1384 gROOT->GetListOfTypes()->Add(typedf);
1390 pcmFile->GetObject(
"__Enums", enums);
1393 auto listOfGlobals =
gROOT->GetListOfGlobals();
1394 auto listOfEnums =
dynamic_cast<THashList*
>(
gROOT->GetListOfEnums());
1396 for (
auto selEnum: *enums){
1397 const char* enumScope = selEnum->
GetTitle();
1398 const char* enumName = selEnum->GetName();
1399 if (strcmp(enumScope,
"") == 0){
1402 if (!listOfEnums->THashList::FindObject(enumName)){
1403 ((
TEnum*) selEnum)->SetClass(
nullptr);
1404 listOfEnums->Add(selEnum);
1406 for (
auto enumConstant: *static_cast<TEnum*>(selEnum)->GetConstants()){
1407 if (!listOfGlobals->FindObject(enumConstant)){
1408 listOfGlobals->Add(enumConstant);
1416 if (!nsTClassEntry){
1419 auto listOfEnums = nsTClassEntry->
fEnums.load();
1430 if (listOfEnums && !listOfEnums->THashList::FindObject(enumName)){
1431 ((
TEnum*) selEnum)->SetClass(nsTClassEntry);
1432 listOfEnums->Add(selEnum);
1445 ::Info(
"TCling::LoadPCM",
"Loading clang PCM %s", pcmFileName.Data());
1459 using namespace clang;
1461 class ExtLexicalStorageAdder:
public RecursiveASTVisitor<ExtLexicalStorageAdder>{
1466 bool VisitRecordDecl(clang::RecordDecl* rcd){
1468 Info(
"ExtLexicalStorageAdder",
1469 "Adding external lexical storage to class %s",
1470 rcd->getNameAsString().c_str());
1471 auto reDeclPtr = rcd->getMostRecentDecl();
1473 reDeclPtr->setHasExternalLexicalStorage();
1474 }
while ((reDeclPtr = reDeclPtr->getPreviousDecl()));
1494 const char** headers,
1495 const char** includePaths,
1496 const char* payloadCode,
1497 const char* fwdDeclsCode,
1498 void (*triggerFunc)(),
1500 const char** classesHeaders,
1501 Bool_t lateRegistration )
1504 static const bool fromRootCling = dlsym(RTLD_DEFAULT,
"usedToIdentifyRootClingByDlSym");
1508 if (fromRootCling)
return;
1512 bool isACLiC =
false;
1513 if (hasHeaderParsingOnDemand &&
1514 strstr(modulename,
"_ACLiC_dict") !=
nullptr){
1516 Info(
"TCling::RegisterModule",
1517 "Header parsing on demand is active but this is an Aclic library. Disabling it for this library.");
1518 hasHeaderParsingOnDemand =
false;
1535 for (
const char** inclPath = includePaths; *inclPath; ++inclPath) {
1538 cling::Transaction*
T = 0;
1540 for (
auto& fwdDeclArgToSkipPair : fwdDeclsArgToSkip){
1541 const std::string& fwdDecl = fwdDeclArgToSkipPair.first;
1542 const int nArgsToSkip = fwdDeclArgToSkipPair.second;
1544 assert(cling::Interpreter::kSuccess == compRes &&
1545 "A fwd declaration could not be compiled");
1546 if (compRes!=cling::Interpreter::kSuccess){
1547 Warning(
"TCling::RegisterModule",
1548 "Problems in declaring string '%s' were encountered.",
1563 TString code = gNonInterpreterClassDef;
1564 code += payloadCode;
1566 const char* dyLibName =
nullptr;
1570 if (!lateRegistration) {
1578 void* dyLibHandle = dlopen(dyLibName, RTLD_LAZY | RTLD_GLOBAL);
1581 char dyLibError[1000];
1582 FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
NULL, GetLastError(),
1583 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), dyLibError,
1584 sizeof(dyLibError),
NULL);
1586 const char* dyLibError = dlerror();
1591 ::Info(
"TCling::RegisterModule",
1592 "Cannot open shared library %s for dictionary %s:\n %s",
1593 dyLibName, modulename, dyLibError);
1603 if (hasHeaderParsingOnDemand && fwdDeclsCode){
1606 std::string fwdDeclsCodeLessEnums;
1610 std::string fwdDeclsLine;
1611 std::istringstream fwdDeclsCodeStr(fwdDeclsCode);
1612 std::vector<std::string> scope;
1613 while (std::getline(fwdDeclsCodeStr, fwdDeclsLine)) {
1614 if (fwdDeclsLine.find(
"namespace ") == 0
1615 || fwdDeclsLine.find(
"inline namespace ") == 0) {
1617 scope.push_back(fwdDeclsLine.substr(10,
1618 fwdDeclsLine.length() - 10 - 2));
1619 }
else if (fwdDeclsLine ==
"}") {
1621 }
else if (fwdDeclsLine.find(
"enum __attribute__((annotate(\"") == 0) {
1622 clang::DeclContext* DC = 0;
1623 for (
auto &&aScope: scope) {
1624 DC = cling::utils::Lookup::Namespace(&
fInterpreter->getSema(), aScope.c_str(), DC);
1630 if (scope.empty() || DC) {
1632 size_t posEnumName = fwdDeclsLine.find(
"\"))) ", 32);
1633 R__ASSERT(posEnumName != std::string::npos &&
"Inconsistent enum fwd decl!");
1635 while (isspace(fwdDeclsLine[posEnumName]))
1637 size_t posEnumNameEnd = fwdDeclsLine.find(
" : ", posEnumName);
1638 R__ASSERT(posEnumNameEnd != std::string::npos &&
"Inconsistent enum fwd decl (end)!");
1639 while (isspace(fwdDeclsLine[posEnumNameEnd]))
1643 std::string enumName = fwdDeclsLine.substr(posEnumName,
1644 posEnumNameEnd - posEnumName + 1);
1646 if (clang::NamedDecl* enumDecl
1647 = cling::utils::Lookup::Named(&
fInterpreter->getSema(),
1648 enumName.c_str(), DC)) {
1651 R__ASSERT(llvm::dyn_cast<clang::EnumDecl>(enumDecl) &&
"not an enum decl!");
1657 fwdDeclsCodeLessEnums += fwdDeclsLine +
"\n";
1661 if (fwdDeclsCodeLessEnums.size() != 0){
1662 auto compRes =
fInterpreter->declare(fwdDeclsCodeLessEnums, &T);
1663 assert(cling::Interpreter::kSuccess == compRes &&
1664 "The forward declarations could not be compiled");
1665 if (compRes!=cling::Interpreter::kSuccess){
1666 Warning(
"TCling::RegisterModule",
1667 "Problems in compiling forward declarations for module %s: '%s'",
1668 modulename, fwdDeclsCodeLessEnums.c_str()) ;
1676 ExtLexicalStorageAdder elsa;
1677 for (
auto dciIt = T->decls_begin();dciIt!=T->decls_end();dciIt++){
1678 cling::Transaction::DelayCallInfo& dci = *dciIt;
1679 for(
auto dit = dci.m_DGR.begin(); dit != dci.m_DGR.end(); ++dit) {
1680 clang::Decl* declPtr = *dit;
1681 elsa.TraverseDecl(declPtr);
1695 for (
const char** classesHeader = classesHeaders; *classesHeader; ++classesHeader) {
1696 temp=*classesHeader;
1698 size_t theTemplateHash = 0;
1699 bool addTemplate =
false;
1700 size_t posTemplate = temp.find(
'<');
1701 if (posTemplate != std::string::npos) {
1703 std::string templateName = temp.substr(0, posTemplate);
1709 for (
const char** classesHeader_inner = classesHeader; 0!=strcmp(*classesHeader_inner,
"@"); ++classesHeader_inner,++classesHeader){
1711 if (payloadCode == *classesHeader_inner ){
1713 if (addTemplate)
fPayloads.insert(theTemplateHash);
1716 Info(
"TCling::RegisterModule",
1717 "Adding a header for %s", temp.c_str());
1723 addTemplate =
false;
1730 if (strcmp(modulename,
"libCore")!=0 && strcmp(modulename,
"libRint")!=0
1731 && strcmp(modulename,
"libThread")!=0 && strcmp(modulename,
"libRIO")!=0
1732 && strcmp(modulename,
"libcomplexDict")!=0 && strcmp(modulename,
"libdequeDict")!=0
1733 && strcmp(modulename,
"liblistDict")!=0 && strcmp(modulename,
"libforward_listDict")!=0
1734 && strcmp(modulename,
"libvectorDict")!=0
1735 && strcmp(modulename,
"libmapDict")!=0 && strcmp(modulename,
"libmultimap2Dict")!=0
1736 && strcmp(modulename,
"libmap2Dict")!=0 && strcmp(modulename,
"libmultimapDict")!=0
1737 && strcmp(modulename,
"libsetDict")!=0 && strcmp(modulename,
"libmultisetDict")!=0
1738 && strcmp(modulename,
"libunordered_setDict")!=0 && strcmp(modulename,
"libunordered_multisetDict")!=0
1739 && strcmp(modulename,
"libunordered_mapDict")!=0 && strcmp(modulename,
"libunordered_multimapDict")!=0
1740 && strcmp(modulename,
"libvalarrayDict")!=0
1741 && strcmp(modulename,
"G__GenVector32")!=0 && strcmp(modulename,
"G__Smatrix32")!=0
1745 if (!
LoadPCM(pcmFileName, headers, triggerFunc)) {
1746 ::Error(
"TCling::RegisterModule",
"cannot find dictionary module %s",
1751 bool oldValue =
false;
1759 clangDiagSuppr diagSuppr(
fInterpreter->getSema().getDiagnostics());
1761 #if defined(R__MUST_REVISIT) 1762 #if R__MUST_REVISIT(6,2) 1763 Warning(
"TCling::RegisterModule",
"Diagnostics suppression should be gone by now.");
1767 if (!hasHeaderParsingOnDemand){
1770 const cling::Transaction* watermark =
fInterpreter->getLastTransaction();
1771 cling::Interpreter::CompilationResult compRes =
fInterpreter->parseForModule(code.Data());
1777 assert(cling::Interpreter::kSuccess == compRes &&
1778 "Payload code of a dictionary could not be parsed correctly.");
1779 if (compRes!=cling::Interpreter::kSuccess) {
1780 Warning(
"TCling::RegisterModule",
1781 "Problems declaring payload for module %s.", modulename) ;
1790 if (!hasHeaderParsingOnDemand) {
1817 if (!hasHeaderParsingOnDemand) {
1820 "#undef __ROOTCLING__\n" 1821 + gInterpreterClassDef +
1828 dlclose(dyLibHandle);
1850 typedef std::vector<std::pair<TClass*,DictFuncPtr_t> >::iterator iterator;
1856 if ( i->first == oldcl ) {
1878 const char* input_line,
1879 cling::Interpreter::CompilationResult& compRes,
1883 return metaProcessor->process(input_line, compRes, result);
1885 catch (cling::InvalidDerefException&
ex)
1887 Error(
"HandleInterpreterException",
"%s.\n%s", ex.what(),
"Execution of your code was aborted.");
1897 if (
auto ie = dynamic_cast<const cling::InterpreterException*>(&e)) {
1913 TString sLine(line);
1929 gROOT->SetLineIsProcessing();
1933 gROOT->SetLineHasBeenProcessed();
1946 gROOT->SetLineIsProcessing();
1948 struct InterpreterFlagsRAII {
1950 bool fWasDynamicLookupEnabled;
1952 InterpreterFlagsRAII(cling::Interpreter* interp):
1954 fWasDynamicLookupEnabled(interp->isDynamicLookupEnabled())
1956 fInterpreter->enableDynamicLookup(
true);
1958 ~InterpreterFlagsRAII() {
1959 fInterpreter->enableDynamicLookup(fWasDynamicLookupEnabled);
1960 gROOT->SetLineHasBeenProcessed();
1969 cling::Interpreter::CompilationResult compRes = cling::Interpreter::kSuccess;
1970 if (!strncmp(sLine.Data(),
".L", 2) || !strncmp(sLine.Data(),
".x", 2) ||
1971 !strncmp(sLine.Data(),
".X", 2)) {
1974 TString mod_line(sLine);
1979 aclicMode, arguments, io);
1980 if (aclicMode.Length()) {
1982 R__ASSERT(aclicMode[0]==
'+' &&
"ACLiC mode must start with a +");
1984 if (aclicMode[1]==
'+') {
1990 compRes = cling::Interpreter::kFailure;
1992 if (strncmp(sLine.Data(),
".L", 2) != 0) {
1995 if (arguments.Length()==0) {
1999 Ssiz_t ext = fname.Last(
'.');
2004 mod_line =
function + arguments + io;
2005 cling::MetaProcessor::MaybeRedirectOutputRAII RAII(
fMetaProcessor);
2011 size_t unnamedMacroOpenCurly;
2014 std::string codeline;
2015 std::ifstream in(fname);
2017 std::getline(in, codeline);
2018 code += codeline +
"\n";
2020 unnamedMacroOpenCurly
2021 = cling::utils::isUnnamedMacro(code,
fInterpreter->getCI()->getLangOpts());
2025 cling::MetaProcessor::MaybeRedirectOutputRAII RAII(
fMetaProcessor);
2026 if (unnamedMacroOpenCurly != std::string::npos) {
2028 unnamedMacroOpenCurly);
2038 if (0!=strncmp(sLine.Data(),
".autodict ",10) && sLine !=
".autodict") {
2041 cling::MetaProcessor::MaybeRedirectOutputRAII RAII(
fMetaProcessor);
2044 bool isInclusionDirective = sLine.Contains(
"\n#include") || sLine.BeginsWith(
"#include");
2045 if (isInclusionDirective) {
2053 if (result.isValid())
2062 case cling::Interpreter::kSuccess: *error =
kNoError;
break;
2063 case cling::Interpreter::kFailure: *error =
kRecoverable;
break;
2064 case cling::Interpreter::kMoreInputExpected: *error =
kProcessing;
break;
2067 if (compRes == cling::Interpreter::kSuccess
2069 && !result.isVoid())
2071 gROOT->SetLineHasBeenProcessed();
2072 return result.simplisticCastAs<
long>();
2074 gROOT->SetLineHasBeenProcessed();
2095 if (path[0] ==
'-' && path[1] ==
'I')
2119 static const TClassRef clRefString(
"std::string");
2120 if (clRefString == cl) {
2130 const char* cobj = (
const char*) obj;
2137 auto inspInspect = [&] (ptrdiff_t offset){
2138 insp.
Inspect(const_cast<TClass*>(cl), insp.
GetParent(),
"_real", cobj, isTransient);
2139 insp.
Inspect(const_cast<TClass*>(cl), insp.
GetParent(),
"_imag", cobj + offset, isTransient);
2143 switch(complexType) {
2150 inspInspect(
sizeof(
float));
2155 inspInspect(
sizeof(
double));
2160 inspInspect(
sizeof(
int));
2165 inspInspect(
sizeof(
long));
2170 static clang::PrintingPolicy
2172 if (printPol.Indentation) {
2174 printPol.Indentation = 0;
2175 printPol.SuppressInitializers =
true;
2178 const char* clname = cl->
GetName();
2181 const clang::ASTContext& astContext =
fInterpreter->getCI()->getASTContext();
2182 const clang::Decl *scopeDecl = 0;
2187 scopeDecl = clingCI->
GetDecl();
2188 recordType = clingCI->
GetType();
2190 const cling::LookupHelper& lh =
fInterpreter->getLookupHelper();
2192 scopeDecl = lh.findScope(clname, cling::LookupHelper::NoDiagnostics,
2196 Error(
"InspectMembers",
"Cannot find Decl for class %s", clname);
2199 const clang::CXXRecordDecl* recordDecl
2200 = llvm::dyn_cast<
const clang::CXXRecordDecl>(scopeDecl);
2202 Error(
"InspectMembers",
"Cannot find Decl for class %s is not a CXXRecordDecl.", clname);
2209 cling::Interpreter::PushTransactionRAII deserRAII(
fInterpreter);
2211 astContext.getASTRecordLayout(recordDecl);
2213 for (clang::RecordDecl::field_iterator iField = recordDecl->field_begin(),
2214 eField = recordDecl->field_end(); iField != eField; ++iField) {}
2217 const clang::ASTRecordLayout& recLayout
2218 = astContext.getASTRecordLayout(recordDecl);
2225 if (cl->
Size() != recLayout.getSize().getQuantity()) {
2226 Error(
"InspectMembers",
"TClass and cling disagree on the size of the class %s, respectively %d %lld\n",
2230 unsigned iNField = 0;
2233 for (clang::RecordDecl::field_iterator iField = recordDecl->field_begin(),
2234 eField = recordDecl->field_end(); iField != eField;
2235 ++iField, ++iNField) {
2238 clang::QualType memberQT = iField->getType();
2243 memberQT = cling::utils::Transform::GetPartiallyDesugaredType(astContext, memberQT,
fNormalizedCtxt->
GetConfig(),
false );
2244 if (memberQT.isNull()) {
2245 std::string memberName;
2246 llvm::raw_string_ostream stream(memberName);
2248 printPol.AnonymousTagLocations =
false;
2249 iField->getNameForDiagnostic(stream, printPol,
true );
2251 Error(
"InspectMembers",
2252 "Cannot retrieve QualType for member %s while inspecting class %s",
2253 memberName.c_str(), clname);
2256 const clang::Type* memType = memberQT.getTypePtr();
2258 std::string memberName;
2259 llvm::raw_string_ostream stream(memberName);
2261 printPol.AnonymousTagLocations =
false;
2262 iField->getNameForDiagnostic(stream, printPol,
true );
2264 Error(
"InspectMembers",
2265 "Cannot retrieve Type for member %s while inspecting class %s",
2266 memberName.c_str(), clname);
2271 Bool_t ispointer =
false;
2272 if (memNonPtrType->isPointerType()) {
2274 clang::QualType ptrQT
2275 = memNonPtrType->getAs<clang::PointerType>()->getPointeeType();
2280 ptrQT = cling::utils::Transform::GetPartiallyDesugaredType(astContext, ptrQT,
fNormalizedCtxt->
GetConfig(),
false );
2281 if (ptrQT.isNull()) {
2282 std::string memberName;
2283 llvm::raw_string_ostream stream(memberName);
2285 printPol.AnonymousTagLocations =
false;
2286 iField->getNameForDiagnostic(stream, printPol,
true );
2288 Error(
"InspectMembers",
2289 "Cannot retrieve pointee Type for member %s while inspecting class %s",
2290 memberName.c_str(), clname);
2293 memNonPtrType = ptrQT.getTypePtr();
2297 llvm::SmallString<8> arraySize;
2298 const clang::ArrayType* arrType = memNonPtrType->getAsArrayTypeUnsafe();
2299 unsigned arrLevel = 0;
2300 bool haveErrorDueToArray =
false;
2304 const clang::ConstantArrayType* constArrType =
2305 clang::dyn_cast<clang::ConstantArrayType>(arrType);
2307 constArrType->getSize().toStringUnsigned(arraySize);
2310 clang::QualType subArrQT = arrType->getElementType();
2311 if (subArrQT.isNull()) {
2312 std::string memberName;
2313 llvm::raw_string_ostream stream(memberName);
2315 printPol.AnonymousTagLocations =
false;
2316 iField->getNameForDiagnostic(stream, printPol,
true );
2318 Error(
"InspectMembers",
2319 "Cannot retrieve QualType for array level %d (i.e. element type of %s) for member %s while inspecting class %s",
2320 arrLevel, subArrQT.getAsString(printPol).c_str(),
2321 memberName.c_str(), clname);
2322 haveErrorDueToArray =
true;
2325 arrType = subArrQT.getTypePtr()->getAsArrayTypeUnsafe();
2327 if (haveErrorDueToArray) {
2332 std::string fieldName;
2333 if (memType->isPointerType()) {
2338 std::string
ioname(iField->getName());
2341 fieldName += arraySize;
2346 clang::CharUnits offset(astContext.toCharUnitsFromBits(recLayout.getFieldOffset(iNField)));
2347 ptrdiff_t fieldOffset = offset.getQuantity();
2357 auto iFiledQtype = iField->getType();
2358 if (
auto tagDecl = iFiledQtype->getAsTagDecl()){
2359 auto declAccess = tagDecl->getAccess();
2360 if (declAccess == AS_private || declAccess == AS_protected) {
2366 insp.
Inspect(const_cast<TClass*>(cl), insp.
GetParent(), fieldName.c_str(), cobj + fieldOffset, isTransient);
2369 const clang::CXXRecordDecl* fieldRecDecl = memNonPtrType->getAsCXXRecordDecl();
2373 std::string sFieldRecName;
2374 if (!ROOT::TMetaUtils::ExtractAttrPropertyFromName(*fieldRecDecl,
"iotype",sFieldRecName)){
2376 clang::QualType(memNonPtrType,0),
2386 insp.
InspectMember(sFieldRecName.c_str(), cobj + fieldOffset,
2387 (fieldName +
'.').c_str(),
transient);
2395 unsigned iNBase = 0;
2396 for (clang::CXXRecordDecl::base_class_const_iterator iBase
2397 = recordDecl->bases_begin(), eBase = recordDecl->bases_end();
2398 iBase != eBase; ++iBase, ++iNBase) {
2399 clang::QualType baseQT = iBase->getType();
2400 if (baseQT.isNull()) {
2401 Error(
"InspectMembers",
2402 "Cannot find QualType for base number %d while inspecting class %s",
2406 const clang::CXXRecordDecl* baseDecl
2407 = baseQT->getAsCXXRecordDecl();
2409 Error(
"InspectMembers",
2410 "Cannot find CXXRecordDecl for base number %d while inspecting class %s",
2415 std::string sBaseName;
2417 std::vector<TClass*> foundClasses;
2419 if (foundClasses.size()==1){
2420 baseCl=foundClasses[0];
2433 std::string qualNameForDiag;
2435 Error(
"InspectMembers",
2436 "Cannot find TClass for base class %s", qualNameForDiag.c_str() );
2441 if (iBase->isVirtual()) {
2444 Error(
"InspectMembers",
2445 "Base %s of class %s is virtual but no object provided",
2446 sBaseName.c_str(), clname);
2454 baseOffset = ci->
GetBaseOffset(baseCi, const_cast<void*>(obj),
2456 if (baseOffset == -1) {
2457 Error(
"InspectMembers",
2458 "Error calculating offset of virtual base %s of class %s",
2459 sBaseName.c_str(), clname);
2462 Error(
"InspectMembers",
2463 "Cannot calculate offset of virtual base %s of class %s",
2464 sBaseName.c_str(), clname);
2469 baseOffset = recLayout.getBaseClassOffset(baseDecl).getQuantity();
2516 bool oldDynLookup =
fInterpreter->isDynamicLookupEnabled();
2567 std::string file_name = filename;
2568 size_t at = std::string::npos;
2569 while ((at = file_name.find(
"/./")) != std::string::npos)
2570 file_name.replace(at, 3,
"/");
2572 std::string filesStr =
"";
2573 llvm::raw_string_ostream filesOS(filesStr);
2574 clang::SourceManager &SM =
fInterpreter->getCI()->getSourceManager();
2575 cling::ClangInternalState::printIncludedFiles(filesOS, SM);
2578 llvm::SmallVector<llvm::StringRef, 100> files;
2579 llvm::StringRef(filesStr).split(files,
"\n");
2581 std::set<std::string> fileMap;
2583 for (llvm::SmallVector<llvm::StringRef, 100>::const_iterator
2584 iF = files.begin(), iE = files.end(); iF != iE; ++iF) {
2585 if ((*iF) == file_name.c_str())
return kTRUE;
2586 fileMap.insert(*iF);
2589 if (fileMap.empty())
return kFALSE;
2592 TString sFilename(file_name.c_str());
2594 && fileMap.count(sFilename.Data())) {
2600 incPath.Append(
":").Prepend(
" ");
2601 incPath.ReplaceAll(
" -I",
":");
2602 while (incPath.Index(
" :") != -1) {
2603 incPath.ReplaceAll(
" :",
":");
2605 incPath.Prepend(
".:");
2606 sFilename = file_name.c_str();
2608 && fileMap.count(sFilename.Data())) {
2613 sFilename = file_name.c_str();
2615 cling::DynamicLibraryManager* dyLibManager
2618 if (dyLibManager->isLibraryLoaded(found)) {
2623 const clang::DirectoryLookup *CurDir = 0;
2624 clang::Preprocessor &PP =
fInterpreter->getCI()->getPreprocessor();
2625 clang::HeaderSearch &HS = PP.getHeaderSearchInfo();
2626 const clang::FileEntry *FE = HS.LookupFile(file_name.c_str(),
2627 clang::SourceLocation(),
2630 clang::ArrayRef<std::pair<
const clang::FileEntry *,
2631 const clang::DirectoryEntry *>>(),
2640 if (FE && FE->isValid()) {
2642 clang::SourceManager &SM =
fInterpreter->getCI()->getSourceManager();
2644 clang::FileID FID = SM.translateFile(FE);
2645 if (!FID.isInvalid() && FID.getHashValue() == 0)
2648 clang::SrcMgr::SLocEntry SLocE = SM.getSLocEntry(FID);
2649 if (SLocE.isFile() && SLocE.getFile().getContentCache()->getRawBuffer() == 0)
2651 if (!FID.isInvalid())
2655 sFilename = FE->getName();
2657 && fileMap.count(sFilename.Data())) {
2668 #if defined(R__WIN32) || defined(__CYGWIN__) 2669 HMODULE hModules[1024];
2671 unsigned long cbModules;
2673 hProcess = (
void *)::GetCurrentProcess();
2674 ::EnumProcessModules(hProcess, hModules,
sizeof(hModules), &cbModules);
2676 for (i = 1; i < (cbModules /
sizeof(
void *)); i++) {
2677 static const int bufsize = 260;
2678 wchar_t winname[bufsize];
2679 char posixname[bufsize];
2680 ::GetModuleFileNameExW(hProcess, hModules[i], winname, bufsize);
2681 #if defined(__CYGWIN__) 2682 cygwin_conv_path(CCP_WIN_W_TO_POSIX, winname, posixname, bufsize);
2684 std::wstring wpath = winname;
2685 std::replace(wpath.begin(), wpath.end(),
'\\',
'/');
2686 string path(wpath.begin(), wpath.end());
2687 strncpy(posixname, path.c_str(), bufsize);
2693 #elif defined(R__MACOSX) 2697 while (
const mach_header* mh = _dyld_get_image_header(imageIndex)) {
2699 if (mh->filetype == MH_DYLIB) {
2700 if (
const char* imageName = _dyld_get_image_name(imageIndex)) {
2708 #elif defined(R__LINUX) 2721 PointerNo4* procLinkMap = (PointerNo4*)dlopen(0, RTLD_LAZY | RTLD_GLOBAL);
2724 LinkMap* linkMap = (LinkMap*) ((PointerNo4*)procLinkMap->fPtr)->fPtr;
2728 dlclose(procLinkMap);
2732 while (iDyLib->fNext) {
2733 iDyLib = iDyLib->fNext;
2738 Error(
"TCling::UpdateListOfLoadedSharedLibraries",
2739 "Platform not supported!");
2750 if (!filename)
return;
2754 cling::DynamicLibraryManager* DLM =
fInterpreter->getDynamicLibraryManager();
2755 if (!DLM->isLibraryLoaded(filename)) {
2756 DLM->loadLibrary(filename,
true );
2759 #if defined(R__MACOSX) 2761 if (!strncmp(filename,
"/usr/lib/system/", 16)
2762 || !strncmp(filename,
"/usr/lib/libc++", 15)
2763 || !strncmp(filename,
"/System/Library/Frameworks/", 27)
2764 || !strncmp(filename,
"/System/Library/PrivateFrameworks/", 34)
2765 || !strncmp(filename,
"/System/Library/CoreServices/", 29)
2766 || !strcmp(filename,
"cl_kernels")
2767 || strstr(filename,
"/usr/lib/libSystem")
2768 || strstr(filename,
"/usr/lib/libstdc++")
2769 || strstr(filename,
"/usr/lib/libicucore")
2770 || strstr(filename,
"/usr/lib/libbsm")
2771 || strstr(filename,
"/usr/lib/libobjc")
2772 || strstr(filename,
"/usr/lib/libresolv")
2773 || strstr(filename,
"/usr/lib/libauto")
2774 || strstr(filename,
"/usr/lib/libcups")
2775 || strstr(filename,
"/usr/lib/libDiagnosticMessagesClient")
2776 || strstr(filename,
"/usr/lib/liblangid")
2777 || strstr(filename,
"/usr/lib/libCRFSuite")
2778 || strstr(filename,
"/usr/lib/libpam")
2779 || strstr(filename,
"/usr/lib/libOpenScriptingUtil")
2780 || strstr(filename,
"/usr/lib/libextension"))
2782 #elif defined(__CYGWIN__) 2784 static const int bufsize = 260;
2785 char posixwindir[bufsize];
2786 char *windir = getenv(
"WINDIR");
2788 cygwin_conv_path(CCP_WIN_A_TO_POSIX, windir, posixwindir, bufsize);
2790 snprintf(posixwindir,
sizeof(posixwindir),
"/Windows/");
2791 if (strstr(filename, posixwindir) ||
2792 strstr(filename,
"/usr/bin/cyg"))
2794 #elif defined(R__WIN32) 2795 if (strstr(filename,
"/Windows/"))
2797 #elif defined (R__LINUX) 2798 if (strstr(filename,
"/ld-linux")
2799 || strstr(filename,
"linux-gnu/")
2800 || strstr(filename,
"/libstdc++.")
2801 || strstr(filename,
"/libgcc")
2802 || strstr(filename,
"/libc.")
2803 || strstr(filename,
"/libdl.")
2804 || strstr(filename,
"/libm."))
2822 Error(
"Load",
"Trying to load library (%s) from rootcling.",filename);
2828 cling::DynamicLibraryManager* DLM =
fInterpreter->getDynamicLibraryManager();
2829 std::string canonLib = DLM->lookupLibrary(filename);
2830 cling::DynamicLibraryManager::LoadLibResult res
2831 = cling::DynamicLibraryManager::kLoadLibNotFound;
2832 if (!canonLib.empty()) {
2834 res = DLM->loadLibrary(filename, system);
2838 cling::Interpreter::CompilationResult compRes;
2839 cling::MetaProcessor::MaybeRedirectOutputRAII RAII(
fMetaProcessor);
2841 if (compRes == cling::Interpreter::kSuccess)
2842 res = cling::DynamicLibraryManager::kLoadLibSuccess;
2846 if (res == cling::DynamicLibraryManager::kLoadLibSuccess) {
2850 case cling::DynamicLibraryManager::kLoadLibSuccess:
return 0;
2851 case cling::DynamicLibraryManager::kLoadLibAlreadyLoaded:
return 1;
2901 Warning(
"Calc",
"waiting for cling thread to free");
2904 gROOT->SetLineIsProcessing();
2912 cling::Interpreter::CompilationResult cr =
fInterpreter->evaluate(line, valRef);
2913 if (cr != cling::Interpreter::kSuccess) {
2921 if (!valRef.isValid()) {
2930 if (valRef.isVoid()) {
2937 gROOT->SetLineHasBeenProcessed();
2940 return valRef.simplisticCastAs<
long>();
2947 void (*histaddFunc)(
const char*
line))
2952 #if defined(R__MUST_REVISIT) 2953 #if R__MUST_REVISIT(6,2) 2954 Warning(
"SetGetline",
"Cling should support the equivalent of SetGetlineFunc(getlineFunc, histaddFunc)");
2967 if ((std::distance(T.decls_begin(), T.decls_end()) != 1)
2968 || T.deserialized_decls_begin() != T.deserialized_decls_end()
2969 || T.macros_begin() != T.macros_end()
2970 || ((!T.getFirstDecl().isNull()) && ((*T.getFirstDecl().begin()) != T.getWrapperFD()))) {
2987 std::set<TObject*>::iterator iSpecial = ((std::set<TObject*>*)
fgSetOfSpecials)->find(obj);
2990 ((std::set<TObject*>*)fgSetOfSpecials)->erase(iSpecial);
3004 #if defined(R__MUST_REVISIT) 3005 #if R__MUST_REVISIT(6,2) 3007 Warning(
"Reset",
"Cling should support the equivalent of scratch_upto(&fDictPos)");
3017 #if defined(R__MUST_REVISIT) 3018 #if R__MUST_REVISIT(6,2) 3020 Warning(
"ResetAll",
"Cling should support the equivalent of complete reset (unload everything but the startup decls.");
3047 #if defined(R__MUST_REVISIT) 3048 #if R__MUST_REVISIT(6,2) 3050 Warning(
"ResetGlobalVar",
"Cling should support the equivalent of resetglobalvar(obj)");
3062 #if defined(R__MUST_REVISIT) 3063 #if R__MUST_REVISIT(6,2) 3065 Warning(
"RewindDictionary",
"Cling should provide a way to revert transaction similar to rewinddictionary()");
3076 #if defined(R__MUST_REVISIT) 3077 #if R__MUST_REVISIT(6,2) 3079 Warning(
"DeleteGlobal",
"Cling should provide the equivalent of deleteglobal(obj), see also DeleteVariable.");
3091 #if defined(R__MUST_REVISIT) 3092 #if R__MUST_REVISIT(6,2) 3093 Warning(
"DeleteVariable",
"should do more that just reseting the value to zero");
3098 llvm::StringRef srName(name);
3099 const char* unscopedName =
name;
3100 llvm::StringRef::size_type posScope = srName.rfind(
"::");
3101 const clang::DeclContext* declCtx = 0;
3102 if (posScope != llvm::StringRef::npos) {
3103 const cling::LookupHelper& lh =
fInterpreter->getLookupHelper();
3104 const clang::Decl* scopeDecl
3105 = lh.findScope(srName.substr(0, posScope),
3106 cling::LookupHelper::WithDiagnostics);
3108 Error(
"DeleteVariable",
"Cannot find enclosing scope for variable %s",
3112 declCtx = llvm::dyn_cast<clang::DeclContext>(scopeDecl);
3114 Error(
"DeleteVariable",
3115 "Enclosing scope for variable %s is not a declaration context",
3119 unscopedName += posScope + 2;
3121 clang::NamedDecl* nVarDecl
3122 = cling::utils::Lookup::Named(&
fInterpreter->getSema(), unscopedName, declCtx);
3124 Error(
"DeleteVariable",
"Unknown variable %s", name);
3127 clang::VarDecl* varDecl = llvm::dyn_cast<clang::VarDecl>(nVarDecl);
3129 Error(
"DeleteVariable",
"Entity %s is not a variable", name);
3133 clang::QualType qType = varDecl->getType();
3137 if (type->isPointerType()) {
3138 int** ppInt = (
int**)
fInterpreter->getAddressOfGlobal(GlobalDecl(varDecl));
3140 if (ppInt) *ppInt = 0;
3150 #if defined(R__MUST_REVISIT) 3151 #if R__MUST_REVISIT(6,2) 3153 Warning(
"SaveContext",
"Cling should provide a way to record a state watermark similar to store_dictposition(&fDictPos)");
3163 #if defined(R__MUST_REVISIT) 3164 #if R__MUST_REVISIT(6,2) 3166 Warning(
"SaveGlobalsContext",
"Cling should provide a way to record a watermark for the list of global variable similar to store_dictposition(&fDictPosGlobals)");
3200 struct AlternateTupleIntDoubleAsc
3206 struct AlternateTupleIntDoubleDes
3214 std::tuple<int,double> value;
3215 AlternateTupleIntDoubleAsc asc;
3216 AlternateTupleIntDoubleDes des;
3218 size_t offset0 = ((
char*)&(std::get<0>(value))) - ((
char*)&value);
3219 size_t offset1 = ((
char*)&(std::get<1>(value))) - ((
char*)&value);
3221 size_t ascOffset0 = ((
char*)&(asc._0)) - ((
char*)&asc);
3222 size_t ascOffset1 = ((
char*)&(asc._1)) - ((
char*)&asc);
3224 size_t desOffset0 = ((
char*)&(des._0)) - ((
char*)&des);
3225 size_t desOffset1 = ((
char*)&(des._1)) - ((
char*)&des);
3227 if (offset0 == ascOffset0 && offset1 == ascOffset1) {
3229 }
else if (offset0 == desOffset0 && offset1 == desOffset1) {
3239 std::string alternateName =
"TEmulatedTuple";
3240 alternateName.append( classname + 5 );
3242 std::string guard_name;
3244 std::ostringstream guard;
3245 guard <<
"ROOT_INTERNAL_TEmulated_";
3246 guard << guard_name;
3248 std::ostringstream alternateTuple;
3249 alternateTuple <<
"#ifndef " << guard.str() <<
"\n";
3250 alternateTuple <<
"#define " << guard.str() <<
"\n";
3251 alternateTuple <<
"namespace ROOT { namespace Internal {\n";
3252 alternateTuple <<
"template <class... Types> struct TEmulatedTuple;\n";
3253 alternateTuple <<
"template <> struct " << alternateName <<
" {\n";
3258 unsigned int nMember = 0;
3259 auto iter = tupleContent.
fElements.begin() + 1;
3260 auto theEnd = tupleContent.
fElements.end() - 1;
3261 while (iter != theEnd) {
3262 alternateTuple <<
" " << *iter <<
" _" << nMember <<
";\n";
3269 unsigned int nMember = tupleContent.
fElements.size() - 3;
3270 auto iter = tupleContent.
fElements.rbegin() + 1;
3271 auto theEnd = tupleContent.
fElements.rend() - 1;
3272 while (iter != theEnd) {
3273 alternateTuple <<
" " << *iter <<
" _" << nMember <<
";\n";
3280 Fatal(
"TCling::SetClassInfo::AtlernateTuple",
3281 "Layout of std::tuple on this platform is unexpected.");
3286 alternateTuple <<
"};\n";
3287 alternateTuple <<
"}}\n";
3288 alternateTuple <<
"#endif\n";
3290 Error(
"Load",
"Could not declare %s",alternateName.c_str());
3293 alternateName =
"ROOT::Internal::" + alternateName;
3294 return alternateName;
3320 if (strncmp(cl->
GetName(),
"tuple<",strlen(
"tuple<"))==0) {
3327 if (!info->IsValid()) {
3351 zombieCandidate =
kTRUE;
3353 if (!info->IsLoaded()) {
3358 zombieCandidate =
kTRUE;
3408 static const char *anonEnum =
"anonymous enum ";
3409 static const int cmplen = strlen(anonEnum);
3411 if (0 == strncmp(name,anonEnum,cmplen)) {
3430 if (isClassOrNamespaceOnly &&
3433 const char *classname =
name;
3444 const cling::LookupHelper& lh =
fInterpreter->getLookupHelper();
3446 const clang::Decl *decl
3447 = lh.findScope(classname,
3448 gDebug > 5 ? cling::LookupHelper::WithDiagnostics
3449 : cling::LookupHelper::NoDiagnostics,
3453 decl = lh.findScope(buf,
3454 gDebug > 5 ? cling::LookupHelper::WithDiagnostics
3455 : cling::LookupHelper::NoDiagnostics,
3472 clang::ClassTemplateSpecializationDecl *tmpltDecl =
3473 llvm::dyn_cast_or_null<clang::ClassTemplateSpecializationDecl>
3474 (type->getAsCXXRecordDecl());
3475 if (tmpltDecl && !tmpltDecl->getPointOfInstantiation().isValid()) {
3494 if (tci.
Property() & propertiesMask) {
3530 const cling::LookupHelper& lh =
fInterpreter->getLookupHelper();
3531 const clang::Decl *decl
3532 = lh.findClassTemplate(name,
3533 gDebug > 5 ? cling::LookupHelper::WithDiagnostics
3534 : cling::LookupHelper::NoDiagnostics);
3536 std::string strname =
"std::";
3538 decl = lh.findClassTemplate(strname,
3539 gDebug > 5 ? cling::LookupHelper::WithDiagnostics
3540 : cling::LookupHelper::NoDiagnostics);
3566 cl->
fBase = listOfBase;
3582 D =
fInterpreter->getCI()->getASTContext().getTranslationUnitDecl();
3585 if (
const clang::DeclContext* DC = dyn_cast<clang::DeclContext>(D)) {
3586 cling::Interpreter::PushTransactionRAII deserRAII(
fInterpreter);
3588 llvm::SmallVector< DeclContext *, 4> allDeclContexts;
3589 const_cast< clang::DeclContext *
>(DC)->collectAllContexts(allDeclContexts);
3590 for (llvm::SmallVector<DeclContext*, 4>::iterator declIter = allDeclContexts.begin(), declEnd = allDeclContexts.end();
3591 declIter != declEnd; ++declIter) {
3593 for (clang::DeclContext::decl_iterator DI = (*declIter)->decls_begin(),
3594 DE = (*declIter)->decls_end(); DI != DE; ++DI) {
3595 if (
const clang::EnumDecl* ED = dyn_cast<clang::EnumDecl>(*DI)) {
3598 PrintingPolicy Policy(ED->getASTContext().getPrintingPolicy());
3599 llvm::raw_string_ostream stream(buf);
3601 Policy.AnonymousTagLocations =
false;
3602 ED->getNameForDiagnostic(stream, Policy,
false);
3606 const char*
name = buf.c_str();
3608 enumList.
Get(ED, name);
3630 D =
fInterpreter->getCI()->getASTContext().getTranslationUnitDecl();
3634 if (
const clang::DeclContext* DC = dyn_cast<clang::DeclContext>(D)) {
3635 cling::Interpreter::PushTransactionRAII deserRAII(
fInterpreter);
3637 llvm::SmallVector< DeclContext *, 4> allDeclContexts;
3638 const_cast< clang::DeclContext *
>(DC)->collectAllContexts(allDeclContexts);
3639 for (llvm::SmallVector<DeclContext*, 4>::iterator declIter = allDeclContexts.begin(),
3640 declEnd = allDeclContexts.end(); declIter != declEnd; ++declIter) {
3642 for (clang::DeclContext::decl_iterator DI = (*declIter)->decls_begin(),
3643 DE = (*declIter)->decls_end(); DI != DE; ++DI) {
3644 if (
const clang::FunctionTemplateDecl* FTD = dyn_cast<clang::FunctionTemplateDecl>(*DI)) {
3645 funcTempList->
Get(FTD);
3743 if (llvm::isa<clang::NamespaceDecl>(cli->
GetDecl())) {
3752 Error(
"GenerateTClass",
3753 "Cannot find %s::Class_Version()! Class version might be wrong.",
3760 if (newvers == -1) {
3768 newvers = callfunc.
ExecInt(0);
3770 Error(
"GenerateTClass",
3771 "Cannot invoke %s::Class_Version()! Class version might be wrong.",
3775 if (newvers != oldvers) {
3792 static void GenerateTClass_GatherInnerIncludes(cling::Interpreter *interp, TString &includes,
TClingClassInfo *info)
3796 const clang::ClassTemplateSpecializationDecl *templateCl
3797 = llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(info->
GetDecl());
3799 for(
unsigned int i=0; i < templateCl->getTemplateArgs().size(); ++i) {
3800 const clang::TemplateArgument &arg( templateCl->getTemplateArgs().get(i) );
3804 if (!uType->isFundamentalType() && !uType->isEnumeralType()) {
3806 const clang::CXXRecordDecl *argdecl = uType->getAsCXXRecordDecl();
3809 TClingClassInfo subinfo(interp,*(argdecl->getASTContext().getRecordType(argdecl).getTypePtr()));
3810 GenerateTClass_GatherInnerIncludes(interp, includes, &subinfo);
3813 llvm::raw_string_ostream OS(Result);
3814 arg.print(argdecl->getASTContext().getPrintingPolicy(),OS);
3815 Warning(
"TCling::GenerateTClass",
"Missing header file for %s",OS.str().c_str());
3830 if (!info || !info->
IsValid()) {
3831 Fatal(
"GenerateTClass",
"Requires a valid ClassInfo object");
3836 std::string classname;
3840 Info(
"GenerateTClass",
"Will (try to) generate the compiled TClass for %s.",classname.c_str());
3844 GenerateTClass_GatherInnerIncludes(
fInterpreter,includes,info);
3850 Error(
"GenerateTClass",
"Even though the dictionary generation for %s seemed successful we can't find the TClass bootstrap!",classname.c_str());
3856 cl =
new TClass(classinfo, version, 0, 0, -1, -1, silent);
3862 cl =
new TClass(classinfo, 1, 0, 0, -1, -1, silent);
3887 if (classes == 0 || classes[0] == 0) {
3891 std::vector<std::string> listClasses;
3893 const char* current = classes, *prev = classes;
3897 if (*current ==
';') {
3898 listClasses.push_back(std::string(prev, current - prev));
3901 else if (*(current + 1) == 0) {
3902 listClasses.push_back(std::string(prev, current + 1 - prev));
3906 std::vector<std::string> listIncludes;
3908 const char* current = includes, *prev = includes;
3912 if (*current ==
';') {
3913 listIncludes.push_back(std::string(prev, current - prev));
3916 else if (*(current + 1) == 0) {
3917 listIncludes.push_back(std::string(prev, current + 1 - prev));
3923 std::vector<std::string>(), std::vector<std::string>());
3944 if (
const ValueDecl* decl = (
const ValueDecl*) d){
3947 if (hasIoName && ioName != name)
return 0;
3965 const clang::Decl* possibleEnum = 0;
3970 const clang::DeclContext* dc = 0;
3971 if (
const clang::Decl* D = cci->
GetDecl()) {
3972 if (!(dc = dyn_cast<clang::NamespaceDecl>(D))) {
3973 dc = dyn_cast<clang::RecordDecl>(D);
3978 possibleEnum = cling::utils::Lookup::Named(&
fInterpreter->getSema(),
name, dc);
3980 Error(
"TCling::GetEnum",
"DeclContext not found for %s .\n", name);
3985 possibleEnum = cling::utils::Lookup::Named(&
fInterpreter->getSema(),
name);
3987 if (possibleEnum && (possibleEnum != (clang::Decl*)-1)
3988 && isa<clang::EnumDecl>(possibleEnum)) {
3989 return possibleEnum;
4001 llvm::StringRef mangled_name = gv->getName();
4016 std::string scopename(demangled_name_c);
4017 free(demangled_name_c);
4023 std::string dataname;
4025 if (!strncmp(scopename.c_str(),
"typeinfo for ",
sizeof(
"typeinfo for ")-1)) {
4026 scopename.erase(0,
sizeof(
"typeinfo for ")-1);
4027 }
else if (!strncmp(scopename.c_str(),
"vtable for ",
sizeof(
"vtable for ")-1)) {
4028 scopename.erase(0,
sizeof(
"vtable for ")-1);
4031 std::string::size_type pos = scopename.rfind(
'(');
4032 if (pos != std::string::npos) {
4036 pos = scopename.rfind(
':');
4037 if (pos != std::string::npos) {
4038 if ((pos != 0) && (scopename[pos-1] ==
':')) {
4039 dataname = scopename.substr(pos+1);
4040 scopename.erase(pos-1);
4044 dataname = scopename;
4052 if (scopename.size()) {
4068 Error(
"GetDataMemberWithValue()",
"not implemented");
4078 Error(
"GetDataMemberAtAddr()",
"not implemented");
4088 const char* params,
Bool_t objectIsConst )
4100 func.
SetFunc(&gcl, method, params, &offset);
4106 return mangled_name;
4121 GetMethod(method, proto, objectIsConst, 0 , mode).GetMangledName();
4133 const char* params,
Bool_t objectIsConst )
4145 func.
SetFunc(&gcl, method, params, &offset);
4174 std::vector<DeclId_t>& res)
const 4177 const clang::Decl* CtxDecl
4179 S.Context.getTranslationUnitDecl();
4180 const clang::DeclContext*
4181 DeclCtx = llvm::dyn_cast<
const clang::RecordDecl>(CtxDecl);
4183 DeclCtx = dyn_cast<clang::NamespaceDecl>(CtxDecl);
4184 if (!DeclCtx)
return;
4185 clang::DeclarationName DName
4186 = &S.Context.Idents.get(funcname);
4187 clang::LookupResult
R(S, DName, clang::SourceLocation(),
4188 Sema::LookupOrdinaryName, clang::Sema::ForRedeclaration);
4189 S.LookupQualifiedName(R, const_cast<DeclContext*>(DeclCtx));
4190 if (R.empty())
return;
4192 res.reserve(res.size() + (R.end() - R.begin()));
4193 for (clang::LookupResult::iterator IR = R.begin(), ER = R.end();
4195 if (
const clang::FunctionDecl* FD
4196 = llvm::dyn_cast<const clang::FunctionDecl>(*IR)) {
4197 if (!FD->getDescribedFunctionTemplate()) {
4341 func.
SetFunc(&cl,
function, params, &offset);
4357 const char* params,
Bool_t objectIsConst,
int* error)
4370 void* address = (
void*)((
Long_t)addr + offset);
4377 const char* params,
int* error)
4379 Execute(obj,cl,method,params,
false,error);
4394 Error(
"Execute",
"No method was defined");
4403 if (argc > nparms) {
4404 Error(
"Execute",
"Too many parameters to call %s, got %d but expected at most %d.",method->
GetName(),argc,nparms);
4407 if (nparms != argc) {
4417 Int_t firstDefault = -1;
4418 for (
Int_t i = 0; i < nparms; i ++) {
4425 if (firstDefault >= 0) {
4426 Error(
"Execute",
"Too few arguments to call %s, got only %d but expected at least %d and at most %d.",method->
GetName(),argc,firstDefault,nparms);
4428 Error(
"Execute",
"Too few arguments to call %s, got only %d but expected %d.",method->
GetName(),argc,nparms);
4434 const char* listpar =
"";
4435 TString complete(10);
4439 for (
Int_t i = 0; i < argc; i ++) {
4447 TString chpar(
'\"');
4448 chpar += (nxtpar->String()).
ReplaceAll(
"\"",
"\\\"");
4455 complete += nxtpar->String();
4458 listpar = complete.Data();
4476 const CXXMethodDecl * mdecl = dyn_cast<CXXMethodDecl>(minfo->
GetMethodDecl());
4478 void* address = (
void*)((
Long_t)addr + offset);
4485 const void* args[] ,
4490 Error(
"ExecuteWithArgsAndReturn",
"No method was defined");
4496 func.ExecWithArgsAndReturn(address, args, nargs, ret);
4517 Warning(
"GetTopLevelMacroName",
"Must change return type!");
4564 #if defined(R__MUST_REVISIT) 4565 #if R__MUST_REVISIT(6,0) 4566 Warning(
"GetCurrentMacroName",
"Must change return type!");
4579 TTHREAD_TLS(
char*) t = 0;
4580 TTHREAD_TLS(
unsigned int) tlen = 0;
4582 unsigned int dlen = strlen(typeDesc);
4585 t =
new char[dlen + 1];
4588 const char* s, *template_start;
4589 if (!strstr(typeDesc,
"(*)(")) {
4590 s = strchr(typeDesc,
' ');
4591 template_start = strchr(typeDesc,
'<');
4592 if (!strcmp(typeDesc,
"long long")) {
4593 strlcpy(t, typeDesc, dlen + 1);
4595 else if (!strncmp(typeDesc,
"unsigned ", s + 1 - typeDesc)) {
4596 strlcpy(t, typeDesc, dlen + 1);
4602 else if (s && (template_start == 0 || (s < template_start))) {
4603 strlcpy(t, s + 1, dlen + 1);
4606 strlcpy(t, typeDesc, dlen + 1);
4610 strlcpy(t, typeDesc, dlen + 1);
4613 while (l > 0 && (t[l - 1] ==
'*' || t[l - 1] ==
'&')) {
4627 const std::map<char, unsigned int> keyLenMap = {{
'c',6},{
'n',10},{
't',8},{
'h',7},{
'e',5},{
'v',4}};
4629 if (rootmapfile && *rootmapfile) {
4633 std::ifstream
file(rootmapfile);
4634 std::string
line; line.reserve(200);
4635 std::string lib_name; line.reserve(100);
4636 bool newFormat=
false;
4637 while (getline(file, line,
'\n')) {
4639 (strstr(line.c_str(),
"Library.")!=
nullptr || strstr(line.c_str(),
"Declare.")!=
nullptr)) {
4645 if (line.compare(0, 9,
"{ decls }") == 0) {
4648 while (getline(file, line,
'\n')) {
4649 if (line[0] ==
'[')
break;
4650 uniqueString->
Append(line);
4653 const char firstChar=line[0];
4654 if (firstChar ==
'[') {
4656 auto brpos = line.find(
']');
4657 if (brpos == string::npos)
continue;
4658 lib_name = line.substr(1, brpos-1);
4660 while( lib_name[nspaces] ==
' ' ) ++nspaces;
4661 if (nspaces) lib_name.replace(0, nspaces,
"");
4663 TString lib_nameTstr(lib_name.c_str());
4664 TObjArray* tokens = lib_nameTstr.Tokenize(
" ");
4668 Info(
"ReadRootmapFile",
"new section for %s", lib_nameTstr.Data());
4671 Info(
"ReadRootmapFile",
"section for %s (library does not exist)", lib_nameTstr.Data());
4678 auto keyLenIt = keyLenMap.find(firstChar);
4679 if (keyLenIt == keyLenMap.end())
continue;
4680 unsigned int keyLen = keyLenIt->second;
4682 const char *keyname = line.c_str()+keyLen;
4684 Info(
"ReadRootmapFile",
"class %s in %s", keyname, lib_name.c_str());
4687 if(lib_name != isThere->GetValue()){
4688 if (firstChar ==
'n') {
4690 Info(
"ReadRootmapFile",
"namespace %s found in %s is already in %s",
4691 keyname, lib_name.c_str(), isThere->GetValue());
4692 }
else if (firstChar ==
'h'){
4694 lib_name+=isThere->GetValue();
4698 Warning(
"ReadRootmapFile",
"%s %s found in %s is already in %s", line.substr(0, keyLen).c_str(),
4699 keyname, lib_name.c_str(), isThere->GetValue());
4703 Info(
"ReadRootmapFile",
"Key %s was already defined for %s", keyname, lib_name.c_str());
4733 TString
sname =
"system";
4744 #if defined(R__MACOSX) && (TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR) 4776 using namespace clang;
4778 class ExtVisibleStorageAdder:
public RecursiveASTVisitor<ExtVisibleStorageAdder>{
4784 ExtVisibleStorageAdder(std::unordered_set<const NamespaceDecl*>& nsSet): fNSSet(nsSet) {};
4785 bool VisitNamespaceDecl(NamespaceDecl* nsDecl) {
4789 nsDecl->setHasExternalVisibleStorage();
4790 fNSSet.insert(nsDecl);
4794 std::unordered_set<const NamespaceDecl*>& fNSSet;
4831 TObjArray* paths = ldpath.Tokenize(
";");
4833 TObjArray* paths = ldpath.Tokenize(
":");
4840 for (
Int_t j = 0; j < i; j++) {
4841 TString pd = ((
TObjString *)paths->
At(j))->GetString();
4851 Info(
"LoadLibraryMap",
"%s", d.Data());
4856 if (f.EndsWith(
".rootmap")) {
4862 Info(
"LoadLibraryMap",
" rootmap file: %s", p.Data());
4879 if (f.BeginsWith(
"rootmap")) {
4884 Warning(
"LoadLibraryMap",
"please rename %s to end with \".rootmap\"", p.Data());
4897 if (rootmapfile && *rootmapfile) {
4904 else if (res == -3) {
4914 while ((rec = (
TEnvRec*) next())) {
4916 if (!strncmp(cls.Data(),
"Library.", 8) && cls.Length() > 8) {
4923 TObjArray* tokens = libs.Tokenize(delim);
4928 cls.ReplaceAll(
"@@",
"::");
4931 cls.ReplaceAll(
"-",
" ");
4935 Info(
"LoadLibraryMap",
"class %s in %s", cls.Data(), wlib);
4938 Info(
"LoadLibraryMap",
"class %s in %s (library does not exist)", cls.Data(), lib);
4953 else if (!strncmp(cls.Data(),
"Declare.", 8) && cls.Length() > 8) {
4957 cls.ReplaceAll(
"-",
" ");
4963 cling::Transaction*
T =
nullptr;
4965 assert(cling::Interpreter::kSuccess == compRes &&
"A declaration in a rootmap could not be compiled");
4967 if (compRes!=cling::Interpreter::kSuccess){
4969 "Problems in %s declaring '%s' were encountered.", rootmapfile, uniqueString.
Data()) ;
4974 for (
auto declIt = T->decls_begin(); declIt < T->decls_end(); ++declIt) {
4975 if (declIt->m_DGR.isSingleDecl()) {
4976 if (Decl* D = declIt->m_DGR.getSingleDecl()) {
4977 if (NamespaceDecl* NSD = dyn_cast<NamespaceDecl>(D)) {
4978 evsAdder.TraverseDecl(NSD);
5011 const TObjArray* sharedLibL = sharedLibLStr.Tokenize(
" ");
5013 for (
Int_t ilib = 0; ilib < nrSharedLibs; ilib++) {
5014 const TString sharedLibStr = ((
TObjString*)sharedLibL->
At(ilib))->GetString();
5020 TString rootMapBaseStr = sharedLibBaseStr;
5021 if (sharedLibBaseStr.EndsWith(
".dll")) {
5022 rootMapBaseStr.ReplaceAll(
".dll",
"");
5024 else if (sharedLibBaseStr.EndsWith(
".DLL")) {
5025 rootMapBaseStr.ReplaceAll(
".DLL",
"");
5027 else if (sharedLibBaseStr.EndsWith(
".so")) {
5028 rootMapBaseStr.ReplaceAll(
".so",
"");
5030 else if (sharedLibBaseStr.EndsWith(
".sl")) {
5031 rootMapBaseStr.ReplaceAll(
".sl",
"");
5033 else if (sharedLibBaseStr.EndsWith(
".dl")) {
5034 rootMapBaseStr.ReplaceAll(
".dl",
"");
5036 else if (sharedLibBaseStr.EndsWith(
".a")) {
5037 rootMapBaseStr.ReplaceAll(
".a",
"");
5040 Error(
"ReloadAllSharedLibraryMaps",
"Unknown library type %s", sharedLibBaseStr.Data());
5044 rootMapBaseStr +=
".rootmap";
5047 Error(
"ReloadAllSharedLibraryMaps",
"Could not find rootmap %s in path", rootMap);
5054 Error(
"ReloadAllSharedLibraryMaps",
"Error loading map %s", rootMap);
5072 const TObjArray* sharedLibL = sharedLibLStr.Tokenize(
" ");
5074 const TString sharedLibStr = ((
TObjString*)sharedLibL->
At(ilib))->GetString();
5089 if (!
fMapfile || !library || !*library) {
5092 TString libname(library);
5093 Ssiz_t idx = libname.Last(
'.');
5095 libname.Remove(idx);
5097 size_t len = libname.Length();
5102 while ((rec = (
TEnvRec *) next())) {
5104 if (cls.Length() > 2) {
5111 TObjArray* tokens = libs.Tokenize(delim);
5113 if (!strncmp(cls.Data(),
"Library.", 8) && cls.Length() > 8) {
5117 cls.ReplaceAll(
"@@",
"::");
5120 cls.ReplaceAll(
"-",
" ");
5122 if (!strncmp(lib, libname.Data(), len)) {
5124 Error(
"UnloadLibraryMap",
"entry for <%s, %s> not found in library map table", cls.Data(), lib);
5132 TString library_rootmap(library);
5133 if (!library_rootmap.EndsWith(
".rootmap"))
5134 library_rootmap.Append(
".rootmap");
5154 TString key = TString(
"Library.") + cls;
5157 key.ReplaceAll(
"::",
"@@");
5160 key.ReplaceAll(
" ",
"-");
5189 free(demangled_name);
5205 std::string demangled_name(demangled_name_c);
5206 free(demangled_name_c);
5219 result =
AutoLoad(demangled_name.c_str(), knowDictNotLoaded);
5244 Info(
"TCling::AutoLoad",
5245 "Trying to autoload for %s", cls);
5251 Info(
"TCling::AutoLoad",
5252 "Disabled due to gROOT or gInterpreter being invalid/not ready (the class name is %s)", cls);
5259 Info(
"TCling::AutoLoad",
5260 "Explicitly disabled (the class name is %s)", cls);
5276 if (!deplibs.IsNull()) {
5278 TObjArray* tokens = deplibs.Tokenize(delim);
5281 if (
gROOT->LoadClass(cls, deplib) == 0) {
5283 Info(
"TCling::AutoLoad",
5284 "loaded dependent library %s for %s", deplib, cls);
5288 Error(
"TCling::AutoLoad",
5289 "failure loading dependent library %s for %s",
5294 if (lib && lib[0]) {
5295 if (
gROOT->LoadClass(cls, lib) == 0) {
5297 Info(
"TCling::AutoLoad",
5298 "loaded library %s for %s", lib, cls);
5303 Error(
"TCling::AutoLoad",
5304 "failure loading library %s for %s", lib, cls);
5319 cling::Interpreter *interpreter)
5321 std::string code = gNonInterpreterClassDef ;
5328 code += (
"#include \"");
5332 code += (
"#ifdef __ROOTCLING__\n" 5333 "#undef __ROOTCLING__\n" 5334 + gInterpreterClassDef +
5337 cling::Interpreter::CompilationResult cr;
5343 Sema &SemaR = interpreter->getSema();
5345 clangDiagSuppr diagSuppr(SemaR.getDiagnostics());
5347 #if defined(R__MUST_REVISIT) 5348 #if R__MUST_REVISIT(6,2) 5349 Warning(
"TCling::RegisterModule",
"Diagnostics suppression should be gone by now.");
5353 cr = interpreter->parseForModule(code);
5371 Int_t nHheadersParsed = 0;
5374 bool skipFirstEntry =
false;
5375 std::vector<std::string> autoparseKeys;
5376 if (strchr(cls,
'<')) {
5382 if (!autoparseKeys.empty()){
5383 TString templateName(autoparseKeys[0]);
5384 auto tokens = templateName.Tokenize(
"::");
5385 clang::NamedDecl* previousScopeAsNamedDecl =
nullptr;
5386 clang::DeclContext* previousScopeAsContext =
fInterpreter->getCI()->getASTContext().getTranslationUnitDecl();
5388 previousScopeAsContext =
fInterpreter->getSema().getStdNamespace();
5389 for (
auto const scopeObj : *tokens){
5390 auto scopeName = ((
TObjString*) scopeObj)->String().Data();
5391 previousScopeAsNamedDecl = cling::utils::Lookup::Named(&
fInterpreter->getSema(), scopeName, previousScopeAsContext);
5393 if ((clang::NamedDecl*)-1 == previousScopeAsNamedDecl)
break;
5394 previousScopeAsContext = llvm::dyn_cast_or_null<clang::DeclContext>(previousScopeAsNamedDecl);
5395 if (!previousScopeAsContext)
break;
5399 if ((clang::NamedDecl*)-1 != previousScopeAsNamedDecl) {
5400 if (
auto templateDecl = llvm::dyn_cast_or_null<clang::ClassTemplateDecl>(previousScopeAsNamedDecl)) {
5401 if (
auto templatedDecl = templateDecl->getTemplatedDecl()) {
5402 skipFirstEntry =
nullptr != templatedDecl->getDefinition();
5409 if (topLevel) autoparseKeys.emplace_back(cls);
5411 for (
const auto & apKeyStr : autoparseKeys) {
5412 if (skipFirstEntry) {
5413 skipFirstEntry=
false;
5416 if (apKeyStr.empty())
continue;
5417 const char *apKey = apKeyStr.c_str();
5421 Info(
"TCling::AutoParse",
5422 "Starting autoparse for %s\n", apKey);
5427 const cling::Transaction *
T =
fInterpreter->getCurrentTransaction();
5429 auto const &hNamesPtrs = iter->second;
5431 Info(
"TCling::AutoParse",
5432 "We can proceed for %s. We have %s headers.", apKey, std::to_string(hNamesPtrs.size()).c_str());
5434 for (
auto & hName : hNamesPtrs) {
5436 if (0 !=
fPayloads.count(normNameHash)) {
5437 float initRSSval=0.f, initVSIZEval=0.f;
5439 (
void) initVSIZEval;
5442 "Parsing full payload for %s", apKey);
5449 if (cRes != cling::Interpreter::kSuccess) {
5450 if (hName[0] ==
'\n')
5451 Error(
"AutoParse",
"Error parsing payload code for class %s with content:\n%s", apKey, hName);
5460 Info(
"Autoparse",
">>> RSS key %s - before %.3f MB - after %.3f MB - delta %.3f MB", apKey, initRSSval, endRSSval, endRSSval-initRSSval);
5461 Info(
"Autoparse",
">>> VSIZE key %s - before %.3f MB - after %.3f MB - delta %.3f MB", apKey, initVSIZEval, endVSIZEval, endVSIZEval-initVSIZEval);
5467 "Parsing single header %s", hName);
5470 if (cRes != cling::Interpreter::kSuccess) {
5471 Error(
"AutoParse",
"Error parsing headerfile %s for class %s.", hName, apKey);
5483 if (strchr(apKey,
'<')) {
5490 return nHheadersParsed;
5511 Info(
"TCling::AutoParse",
5512 "Trying to autoparse for %s", cls);
5532 if (nHheadersParsed != 0) {
5551 return nHheadersParsed > 0 ? 1 : 0;
5564 mangled_name.c_str())) {
5575 std::string
name(demangled_name_c);
5576 free(demangled_name_c);
5584 if (!strncmp(name.c_str(),
"typeinfo for ",
sizeof(
"typeinfo for ")-1)) {
5585 name.erase(0,
sizeof(
"typeinfo for ")-1);
5586 }
else if (!strncmp(name.c_str(),
"vtable for ",
sizeof(
"vtable for ")-1)) {
5587 name.erase(0,
sizeof(
"vtable for ")-1);
5588 }
else if (!strncmp(name.c_str(),
"operator",
sizeof(
"operator")-1)
5589 && !isalnum(name[
sizeof(
"operator")])) {
5591 name.erase(0,
sizeof(
"operator")-1);
5592 std::string::size_type pos = name.rfind(
'(');
5593 if (pos != std::string::npos) {
5594 name.erase(0, pos + 1);
5595 pos = name.find(
",");
5596 if (pos != std::string::npos) {
5600 pos = name.rfind(
" const");
5601 if (pos != std::string::npos) {
5602 name.erase(pos, strlen(
" const"));
5604 while (!name.empty() && strchr(
"&*", name.back()))
5605 name.erase(name.length() - 1);
5609 std::string::size_type pos = name.rfind(
'(');
5610 if (pos != std::string::npos) {
5614 pos = name.rfind(
':');
5615 if (pos != std::string::npos) {
5616 if ((pos != 0) && (name[pos-1] ==
':')) {
5624 if (libs.IsNull()) {
5633 while (libs.Tokenize(lib, posLib)) {
5643 void* addr = llvm::sys::DynamicLibrary::SearchForAddressOfSymbol(mangled_name.c_str());
5670 const NamedDecl* ND =
static_cast<const NamedDecl*
>(vTD);
5671 const TagDecl* td = dyn_cast<TagDecl>(ND);
5675 tdDef = td->getDefinition();
5681 if (llvm::isa<clang::FunctionDecl>(td->getDeclContext())) {
5685 clang::QualType
type( td->getTypeForDecl(), 0 );
5687 auto declName=ND->getNameAsString();
5695 name = ND->getNameAsString();
5710 const TagDecl* tdOld = llvm::dyn_cast_or_null<TagDecl>(cci->
GetDecl());
5711 if (!tdOld || (tdDef && tdDef != tdOld)) {
5768 std::set<TClass*> modifiedTClasses;
5773 bool isTUTransaction =
false;
5774 if (!T.empty() && T.decls_begin() + 1 == T.decls_end() && !T.hasNestedTransactions()) {
5775 clang::Decl* FirstDecl = *(T.decls_begin()->m_DGR.begin());
5776 if (llvm::isa<clang::TranslationUnitDecl>(FirstDecl)) {
5779 isTUTransaction =
true;
5783 std::set<const void*> TransactionDeclSet;
5784 if (!isTUTransaction && T.decls_end() - T.decls_begin()) {
5785 const clang::Decl* WrapperFD = T.getWrapperFD();
5786 for (cling::Transaction::const_iterator
I = T.decls_begin(),
E = T.decls_end();
5788 if (
I->m_Call != cling::Transaction::kCCIHandleTopLevelDecl
5789 &&
I->m_Call != cling::Transaction::kCCIHandleTagDeclDefinition)
5792 for (DeclGroupRef::const_iterator DI =
I->m_DGR.begin(),
5793 DE =
I->m_DGR.end(); DI != DE; ++DI) {
5794 if (*DI == WrapperFD)
5796 TransactionDeclSet.insert(*DI);
5797 ((
TCling*)
gCling)->HandleNewDecl(*DI,
false, modifiedTClasses);
5804 for (cling::Transaction::const_iterator
I = T.deserialized_decls_begin(),
5805 E = T.deserialized_decls_end();
I !=
E; ++
I) {
5806 for (DeclGroupRef::const_iterator DI =
I->m_DGR.begin(),
5807 DE =
I->m_DGR.end(); DI != DE; ++DI)
5808 if (TransactionDeclSet.find(*DI) == TransactionDeclSet.end()) {
5824 std::vector<TClass*> modifiedTClassesDiff(modifiedTClasses.size());
5825 std::vector<TClass*>::iterator it;
5826 it = set_difference(modifiedTClasses.begin(), modifiedTClasses.end(),
5829 modifiedTClassesDiff.begin());
5830 modifiedTClassesDiff.resize(it - modifiedTClassesDiff.begin());
5833 ((
TCling*)
gCling)->GetModTClasses().insert(modifiedTClassesDiff.begin(),
5834 modifiedTClassesDiff.end());
5835 for (std::vector<TClass*>::const_iterator
I = modifiedTClassesDiff.begin(),
5836 E = modifiedTClassesDiff.end();
I !=
E; ++
I) {
5838 if (!
gROOT->GetListOfClasses()->FindObject(*
I)) {
5842 cling::Interpreter::PushTransactionRAII RAII(
fInterpreter);
5862 for (DeclContext::decl_iterator RI = DC->decls_begin(), RE = DC->decls_end(); RI != RE; ++RI) {
5863 if (isa<VarDecl>(*RI) || isa<FieldDecl>(*RI)) {
5864 const clang::ValueDecl* VD = dyn_cast<ValueDecl>(*RI);
5868 datamembers->
Unload(var);
5871 }
else if (
const FunctionDecl* FD = dyn_cast<FunctionDecl>(*RI)) {
5874 functions->
Unload(
function);
5875 function->Update(0);
5877 }
else if (
const EnumDecl* ED = dyn_cast<EnumDecl>(*RI)) {
5885 if (enumConst && enumConst->IsValid()) {
5886 datamembers->
Unload(enumConst);
5887 enumConst->Update(0);
5893 }
else if (
const FunctionTemplateDecl* FTD = dyn_cast<FunctionTemplateDecl>(*RI)) {
5895 if (functiontemplate) {
5896 functiontemplates->
Unload(functiontemplate);
5897 functiontemplate->
Update(0);
5914 cling::Transaction::const_nested_iterator iNested = T.nested_begin();
5915 for(cling::Transaction::const_iterator
I = T.decls_begin(),
E = T.decls_end();
5917 if (
I->m_Call == cling::Transaction::kCCIHandleVTable)