63#include "RConfigure.h"
64#include "compiledata.h"
83#include "clang/AST/ASTContext.h"
84#include "clang/AST/Decl.h"
85#include "clang/AST/DeclarationName.h"
86#include "clang/AST/GlobalDecl.h"
87#include "clang/AST/RecordLayout.h"
88#include "clang/AST/DeclVisitor.h"
89#include "clang/AST/RecursiveASTVisitor.h"
90#include "clang/AST/Type.h"
91#include "clang/Basic/SourceLocation.h"
92#include "clang/Basic/Specifiers.h"
93#include "clang/Basic/TargetInfo.h"
94#include "clang/CodeGen/ModuleBuilder.h"
95#include "clang/Frontend/CompilerInstance.h"
96#include "clang/Frontend/FrontendDiagnostic.h"
97#include "clang/Lex/HeaderSearch.h"
98#include "clang/Lex/Preprocessor.h"
99#include "clang/Lex/PreprocessorOptions.h"
100#include "clang/Parse/Parser.h"
101#include "clang/Sema/Lookup.h"
102#include "clang/Sema/Sema.h"
103#include "clang/Serialization/ASTReader.h"
104#include "clang/Serialization/GlobalModuleIndex.h"
106#include "cling/Interpreter/ClangInternalState.h"
107#include "cling/Interpreter/DynamicLibraryManager.h"
108#include "cling/Interpreter/Interpreter.h"
109#include "cling/Interpreter/LookupHelper.h"
110#include "cling/Interpreter/Value.h"
111#include "cling/Interpreter/Transaction.h"
112#include "cling/MetaProcessor/MetaProcessor.h"
113#include "cling/Utils/AST.h"
114#include "cling/Utils/ParserStateRAII.h"
115#include "cling/Utils/SourceNormalization.h"
116#include "cling/Interpreter/Exception.h"
118#include "llvm/IR/GlobalValue.h"
119#include "llvm/IR/Module.h"
121#include "llvm/Support/DynamicLibrary.h"
122#include "llvm/Support/raw_ostream.h"
123#include "llvm/Support/Path.h"
124#include "llvm/Support/Process.h"
125#include "llvm/Object/ELFObjectFile.h"
126#include "llvm/Object/ObjectFile.h"
127#include "llvm/Object/SymbolicFile.h"
128#include "llvm/Support/FileSystem.h"
142#include <unordered_map>
143#include <unordered_set>
150#define R__DLLEXPORT __attribute__ ((visibility ("default")))
158#include <mach-o/dyld.h>
159#include <mach-o/loader.h>
173#if defined(__CYGWIN__)
174#include <sys/cygwin.h>
175#define HMODULE void *
177 __declspec(dllimport)
void * __stdcall GetCurrentProcess();
178 __declspec(dllimport)
bool __stdcall EnumProcessModules(
void *,
void **,
unsigned long,
unsigned long *);
179 __declspec(dllimport)
unsigned long __stdcall GetModuleFileNameExW(
void *,
void *,
wchar_t *,
unsigned long);
186# define STDIN_FILENO 0
189# define STDOUT_FILENO 1
192# define STDERR_FILENO 2
201#undef GetModuleFileName
202#define RTLD_DEFAULT ((void *)::GetModuleHandle(NULL))
203#define dlsym(library, function_name) ::GetProcAddress((HMODULE)library, function_name)
204#define dlopen(library_name, flags) ::LoadLibraryA(library_name)
205#define dlclose(library) ::FreeLibrary((HMODULE)library)
206#define R__DLLEXPORT __declspec(dllexport)
214 return D->getDeclContext();
217 return llvm::dyn_cast<clang::NamespaceDecl>(DC);
220 return llvm::dyn_cast<clang::RecordDecl>(DC);
223 return DC->dumpDeclContext();
232 return ((clang::Decl*)D)->dump();
235 if (clang::NamedDecl* ND = llvm::dyn_cast<clang::NamedDecl>(D)) {
238 llvm::raw_string_ostream OS(
name);
239 ND->getNameForDiagnostic(OS, D->getASTContext().getPrintingPolicy(),
242 printf(
"%s\n",
name.c_str());
250 return D->isInvalidDecl();
254 assert(info && info->
IsValid());
255 return info->
GetDecl()->isInvalidDecl();
259using namespace clang;
263 static const std::string gInterpreterClassDef = R
"ICF(
265#define ClassDef(name, id) \
266_ClassDefInterp_(name,id,virtual,) \
267static int DeclFileLine() { return __LINE__; }
269#define ClassDefNV(name, id) \
270_ClassDefInterp_(name,id,,) \
271static int DeclFileLine() { return __LINE__; }
272#undef ClassDefOverride
273#define ClassDefOverride(name, id) \
274_ClassDefInterp_(name,id,,override) \
275static int DeclFileLine() { return __LINE__; }
278 static const std::string gNonInterpreterClassDef = R
"ICF(
279#define __ROOTCLING__ 1
281#define ClassDef(name,id) \
282_ClassDefOutline_(name,id,virtual,) \
283static int DeclFileLine() { return __LINE__; }
285#define ClassDefNV(name, id)\
286_ClassDefOutline_(name,id,,)\
287static int DeclFileLine() { return __LINE__; }
288#undef ClassDefOverride
289#define ClassDefOverride(name, id)\
290_ClassDefOutline_(name,id,,override)\
291static int DeclFileLine() { return __LINE__; }
295 static const std::string gClassDefInterpMacro = R
"ICF(
298#define _ClassDefInterp_(name,id,virtual_keyword, overrd) \
301 static TClass *Class() { static TClass* sIsA = 0; if (!sIsA) sIsA = TClass::GetClass(#name); return sIsA; } \
302 static const char *Class_Name() { return #name; } \
303 virtual_keyword Bool_t CheckTObjectHashConsistency() const overrd { return true; } \
304 static Version_t Class_Version() { return id; } \
305 static TClass *Dictionary() { return 0; } \
306 virtual_keyword TClass *IsA() const overrd { return name::Class(); } \
307 virtual_keyword void ShowMembers(TMemberInspector&insp) const overrd { ::ROOT::Class_ShowMembers(name::Class(), this, insp); } \
308 virtual_keyword void Streamer(TBuffer&) overrd { ::Error("Streamer", "Cannot stream interpreted class."); } \
309 void StreamerNVirtual(TBuffer&ClassDef_StreamerNVirtual_b) { name::Streamer(ClassDef_StreamerNVirtual_b); } \
310 static const char *DeclFileName() { return __FILE__; } \
311 static int ImplFileLine() { return 0; } \
312 static const char *ImplFileName() { return __FILE__; }
343 return ((
TCling*)
gCling)->LibraryLoadingFailed(errmessage, libStem, permanent, resolved);
382 static vector<const NamedDecl*> updateList;
385 if (entered) topLevel =
kFALSE;
400 updateList.push_back(TD);
403 while (!updateList.empty()) {
405 updateList.pop_back();
412 const clang::Decl* D =
static_cast<const clang::Decl*
>(enumObj->
GetDeclId());
413 if(
const clang::EnumDecl* ED = dyn_cast<clang::EnumDecl>(D)) {
415 for (EnumDecl::enumerator_iterator EDI = ED->enumerator_begin(),
416 EDE = ED->enumerator_end(); EDI != EDE; ++EDI) {
418 std::string constbuf;
419 if (
const NamedDecl* END = llvm::dyn_cast<NamedDecl>(*EDI)) {
420 PrintingPolicy Policy((*EDI)->getASTContext().getPrintingPolicy());
421 llvm::raw_string_ostream stream(constbuf);
423 Policy.AnonymousTagLocations =
false;
424 (END)->getNameForDiagnostic(stream, Policy,
false);
426 const char* constantName = constbuf.c_str();
430 const llvm::APSInt valAPSInt = (*EDI)->getInitVal();
431 if (valAPSInt.isSigned()) {
432 value = valAPSInt.getSExtValue();
434 value = valAPSInt.getZExtValue();
441 DataMemberInfo_t* dmInfo = (DataMemberInfo_t*) tcDmInfo;
445 enumConstant =
new TEnumConstant(dmInfo, constantName, value, enumObj);
452 globals->
Add(enumConstant);
465 const clang::Decl* D =
static_cast<const clang::Decl*
>(VD);
467 if (
const EnumDecl* ED = llvm::dyn_cast<EnumDecl>(D)) {
469 PrintingPolicy Policy(ED->getASTContext().getPrintingPolicy());
470 llvm::raw_string_ostream stream(buf);
472 Policy.AnonymousTagLocations =
false;
473 ED->getNameForDiagnostic(stream, Policy,
false);
479 const char*
name = buf.c_str();
490 const clang::Decl* D =
static_cast<const clang::Decl*
>(DV);
492 if (!D->isCanonicalDecl() && !isa<clang::NamespaceDecl>(D)
493 && !dyn_cast<clang::RecordDecl>(D))
return;
495 if (isa<clang::FunctionDecl>(D->getDeclContext())
496 || isa<clang::TagDecl>(D->getDeclContext()))
500 if (
const clang::CXXRecordDecl* RD = dyn_cast<clang::CXXRecordDecl>(D)) {
501 if (RD->getDescribedClassTemplate())
503 }
else if (
const clang::FunctionDecl* FD = dyn_cast<clang::FunctionDecl>(D)) {
504 if (FD->getDescribedFunctionTemplate())
508 if (
const RecordDecl *TD = dyn_cast<RecordDecl>(D)) {
509 if (TD->isCanonicalDecl() || TD->isThisDeclarationADefinition())
512 else if (
const NamedDecl *ND = dyn_cast<NamedDecl>(D)) {
514 if (
const TagDecl *TD = dyn_cast<TagDecl>(D)) {
518 }
else if (
const NamespaceDecl* NSD = dyn_cast<NamespaceDecl>(D)) {
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)));
574 const char* canonicalName) {
575 ((
TCling*)
gCling)->LibraryLoaded(dyLibHandle, canonicalName);
580 ((
TCling *)
gCling)->RegisterRdictForLoadPCM(pcmFileNameFullPath, pcmContent);
584 const char* canonicalName) {
585 ((
TCling*)
gCling)->LibraryUnloaded(dyLibHandle, canonicalName);
591 return ((
TCling*)
gCling)->GetObjectAddress(Name, LookupCtx);
601 auto tcling =
new TCling(
"C++",
"cling C++ Interpreter", argv);
602 cling::DynamicLibraryManager::ExposeHiddenSharedLibrarySymbols(interpLibHandle);
625 return ((
TCling*)
gCling)->GetClassSharedLibs(className);
631 return ((
TCling*)
gCling)->IsAutoLoadNamespaceCandidate(nsDecl);
636 string file(fileName);
642 string &args,
string &io,
string &fname)
644 string file(fileName);
645 TString f, amode, arguments, aclicio;
647 mode = amode.
Data(); args = arguments.
Data();
648 io = aclicio.
Data(); fname =
f.Data();
658 char *__unDName(
char *demangled,
const char *mangled,
int out_len,
659 void * (* pAlloc )(
size_t),
void (* pFree )(
void *),
660 unsigned short int flags);
672 using namespace clang;
673 if (NamespaceDecl* nsd = llvm::dyn_cast<NamespaceDecl>(decl)){
677 if (ClassTemplateDecl* ctd = llvm::dyn_cast<ClassTemplateDecl>(decl)){
689 return ((
TCling*)
gCling)->LazyFunctionCreatorAutoload(mangled_name);
698 const std::vector<std::string> &headers,
699 const std::vector<std::string> &fwdDecls,
700 const std::vector<std::string> &unknown)
706 if (classes.empty()) {
710 const std::string& className = classes[0];
712 TString fileName =
"AutoDict_";
713 std::string::const_iterator sIt;
714 for (sIt = className.begin(); sIt != className.end(); ++sIt) {
715 if (*sIt ==
'<' || *sIt ==
'>' ||
716 *sIt ==
' ' || *sIt ==
'*' ||
717 *sIt ==
',' || *sIt ==
'&' ||
725 if (classes.size() > 1) {
727 std::vector<std::string>::const_iterator it = classes.begin();
728 while ((++it) != classes.end()) {
729 for (
UInt_t cursor = 0; cursor != it->length(); ++cursor) {
730 chk = chk * 3 + it->at(cursor);
743 static const std::set<std::string> sSTLTypes {
744 "vector",
"list",
"forward_list",
"deque",
"map",
"unordered_map",
"multimap",
745 "unordered_multimap",
"set",
"unordered_set",
"multiset",
"unordered_multiset",
746 "queue",
"priority_queue",
"stack",
"iterator"};
747 std::vector<std::string>::const_iterator it;
748 std::string fileContent(
"");
749 for (it = headers.begin(); it != headers.end(); ++it) {
750 fileContent +=
"#include \"" + *it +
"\"\n";
752 for (it = unknown.begin(); it != unknown.end(); ++it) {
758 while (dirbase.
Length() && dirbase !=
"."
759 && dirbase !=
"include" && dirbase !=
"inc"
760 && dirbase !=
"prec_stl") {
764 fileContent +=
TString(
"#include \"") + header +
"\"\n";
767 for (it = fwdDecls.begin(); it != fwdDecls.end(); ++it) {
768 fileContent +=
"class " + *it +
";\n";
770 fileContent +=
"#ifdef __CINT__ \n";
771 fileContent +=
"#pragma link C++ nestedclasses;\n";
772 fileContent +=
"#pragma link C++ nestedtypedefs;\n";
773 for (it = classes.begin(); it != classes.end(); ++it) {
775 size_t posTemplate =
n.find(
'<');
776 std::set<std::string>::const_iterator iSTLType = sSTLTypes.end();
777 if (posTemplate != std::string::npos) {
778 n.erase(posTemplate, std::string::npos);
779 if (
n.compare(0, 5,
"std::") == 0) {
782 iSTLType = sSTLTypes.find(
n);
784 fileContent +=
"#pragma link C++ class ";
785 fileContent += *it +
"+;\n" ;
786 fileContent +=
"#pragma link C++ class ";
787 if (iSTLType != sSTLTypes.end()) {
791 fileContent += *it +
"::*;\n" ;
796 fileContent += *it +
"::*+;\n" ;
799 fileContent +=
"#endif\n";
803 filePointer = fopen(fileName,
"w");
804 if (filePointer == NULL) {
810 fprintf(filePointer,
"%s", fileContent.c_str());
826 const std::vector<std::string> &headers,
827 const std::vector<std::string> &fwdDecls,
828 const std::vector<std::string> &unknown)
834 std::vector<std::string> classes;
835 classes.push_back(className);
863 void exceptionErrorHandler(
void * ,
864 const std::string& reason,
866 throw std::runtime_error(std::string(
">>> Interpreter compilation error:\n") + reason);
880 class clangDiagSuppr {
882 clangDiagSuppr(clang::DiagnosticsEngine& diag): fDiagEngine(diag){
883 fOldDiagValue = fDiagEngine.getIgnoreAllWarnings();
884 fDiagEngine.setIgnoreAllWarnings(
true);
888 fDiagEngine.setIgnoreAllWarnings(fOldDiagValue);
891 clang::DiagnosticsEngine& fDiagEngine;
913 unsigned long offset = 0;
914 if (strncmp(tname.c_str(),
"const ", 6) == 0) {
917 unsigned long end = tname.length();
918 while( end && (tname[end-1]==
'&' || tname[end-1]==
'*' || tname[end-1]==
']') ) {
919 if ( tname[end-1]==
']' ) {
921 while ( end && tname[end-1]!=
'[' ) --end;
925 std::string innerbuf;
927 if (end != tname.length()) {
928 innerbuf = tname.substr(offset,end-offset);
929 inner = innerbuf.c_str();
931 inner = tname.c_str()+offset;
935 if (
gROOT->GetListOfClasses()->FindObject(inner)
945 const char *newname =
type->GetFullTypeName();
947 newname =
"Long64_t";
949 newname =
"ULong64_t";
951 if (strcmp(inner,newname) == 0) {
954 if (offset) result =
"const ";
956 if ( end != tname.length() ) {
957 result += tname.substr(end,tname.length()-end);
959 if (result == tname) result.clear();
965 if (lastPos != inner)
969 const auto enName = lastPos;
970 const auto scopeNameSize = ((
Long64_t)lastPos - (
Long64_t)inner) /
sizeof(
decltype(*lastPos)) - 2;
971 char *scopeName =
new char[scopeNameSize + 1];
972 strncpy(scopeName, inner, scopeNameSize);
973 scopeName[scopeNameSize] =
'\0';
975 if (
auto scope =
static_cast<TClass *
>(
gROOT->GetListOfClasses()->FindObject(scopeName))) {
976 auto enumTable =
dynamic_cast<const THashList *
>(scope->GetListOfEnums(
false));
977 if (enumTable && enumTable->THashList::FindObject(enName)) {
delete [] scopeName;
return true; }
981 auto listOfEnums = scope->GetListOfEnums();
983 auto enumTable =
dynamic_cast<const THashList *
>(listOfEnums);
984 if (enumTable && enumTable->THashList::FindObject(enName)) {
delete [] scopeName;
return true; }
991 auto enumTable =
dynamic_cast<const THashList *
>(
gROOT->GetListOfEnums());
992 if (enumTable && enumTable->THashList::FindObject(inner))
return true;
1015 return fContent.c_str();
1023 bool notPresent = fLinesHashSet.emplace(fHashFunc(str)).second;
1037static bool LoadModule(
const std::string &ModuleName, cling::Interpreter &interp)
1047 assert(!currentDir.empty());
1050 ::Info(
"TCling::__LoadModule",
"Preloading module %s. \n",
1051 ModuleName.c_str());
1053 cling::Interpreter::PushTransactionRAII deserRAII(&interp);
1054 return interp.loadModule(ModuleName,
true);
1060static void LoadModules(
const std::vector<std::string> &modules, cling::Interpreter &interp)
1062 for (
const auto &modName : modules)
1068 const static bool foundSymbol = dlsym(RTLD_DEFAULT,
"usedToIdentifyRootClingByDlSym");
1073static bool HasASTFileOnDisk(clang::Module *M,
const clang::Preprocessor &PP, std::string *FullFileName =
nullptr)
1075 const HeaderSearchOptions &HSOpts = PP.getHeaderSearchInfo().getHeaderSearchOpts();
1077 std::string ModuleFileName;
1078 if (!HSOpts.PrebuiltModulePaths.empty())
1080 ModuleFileName = PP.getHeaderSearchInfo().getPrebuiltModuleFileName(M->Name);
1082 *FullFileName = ModuleFileName;
1084 return !ModuleFileName.empty();
1090 CompilerInstance &CI = *interp.getCI();
1091 Preprocessor &PP = CI.getPreprocessor();
1092 auto ModuleManager = CI.getModuleManager();
1093 assert(ModuleManager);
1098 if (ModuleIndexPath.empty())
1101 ModuleManager->resetForReload();
1102 ModuleManager->loadGlobalIndex();
1103 GlobalModuleIndex *GlobalIndex = ModuleManager->getGlobalIndex();
1108 ModuleMap &MMap = PP.getHeaderSearchInfo().getModuleMap();
1109 bool RecreateIndex =
false;
1110 for (ModuleMap::module_iterator
I = MMap.module_begin(), E = MMap.module_end();
I != E; ++
I) {
1111 Module *TheModule =
I->second;
1116 RecreateIndex =
true;
1118 if (RecreateIndex) {
1119 cling::Interpreter::PushTransactionRAII deserRAII(&interp);
1120 clang::GlobalModuleIndex::UserDefinedInterestingIDs IDs;
1122 struct DefinitionFinder :
public RecursiveASTVisitor<DefinitionFinder> {
1123 DefinitionFinder(clang::GlobalModuleIndex::UserDefinedInterestingIDs& IDs,
1124 clang::TranslationUnitDecl* TU) : DefinitionIDs(IDs) {
1127 bool VisitNamedDecl(NamedDecl *ND) {
1128 if (!ND->isFromASTFile())
1130 if (!ND->getIdentifier())
1133 if (ND->getAccess() == AS_protected || ND->getAccess() == AS_private)
1136 if (TagDecl *TD = llvm::dyn_cast<TagDecl>(ND)) {
1137 if (TD->isCompleteDefinition())
1139 }
else if (NamespaceDecl *NSD = llvm::dyn_cast<NamespaceDecl>(ND)) {
1140 Register(NSD,
false);
1142 else if (TypedefNameDecl *TND = dyn_cast<TypedefNameDecl>(ND))
1148 clang::GlobalModuleIndex::UserDefinedInterestingIDs &DefinitionIDs;
1149 void Register(
const NamedDecl* ND,
bool AddSingleEntry =
true) {
1150 assert(ND->isFromASTFile());
1153 if (!ND->hasOwningModule()) {
1155 SourceManager &SM = ND->getASTContext().getSourceManager();
1156 SourceLocation Loc = ND->getLocation();
1157 const FileEntry *FE = SM.getFileEntryForID(SM.getFileID(Loc));
1159 assert(FE->getName().contains(
"input_line_"));
1164 Module *OwningModule = ND->getOwningModule()->getTopLevelModule();
1165 assert(OwningModule);
1166 assert(!ND->getName().empty() &&
"Empty name");
1167 if (AddSingleEntry && DefinitionIDs.count(ND->getName()))
1173 DefinitionIDs[ND->getName()].push_back(OwningModule->getASTFile());
1176 DefinitionFinder defFinder(IDs, CI.getASTContext().getTranslationUnitDecl());
1178 llvm::cantFail(GlobalModuleIndex::writeIndex(CI.getFileManager(),
1179 CI.getPCHContainerReader(),
1182 ModuleManager->resetForReload();
1183 ModuleManager->loadGlobalIndex();
1184 GlobalIndex = ModuleManager->getGlobalIndex();
1193 if (!clingInterp.getCI()->getLangOpts().Modules)
1211 LoadModule(
"_Builtin_intrinsics", clingInterp);
1215 std::vector<std::string> CoreModules = {
"ROOT_Foundation_C",
1218 "ROOT_Foundation_Stage1_NoRTTI",
1227 std::vector<std::string> CommonModules = {
"MathCore"};
1233 std::vector<std::string> FIXMEModules = {
"Hist"};
1236 clang::CompilerInstance &CI = *clingInterp.getCI();
1237 GlobalModuleIndex *GlobalIndex =
nullptr;
1239 bool supportedPlatform =
1242#elif defined(R__MACOSX)
1249 llvm::Optional<std::string> envUseGMI = llvm::sys::Process::GetEnv(
"ROOT_USE_GMI");
1250 if (envUseGMI.hasValue()) {
1253 "Cannot convert '%s' to bool, setting to false!",
1254 envUseGMI->c_str());
1258 if (supportedPlatform == value)
1259 ::Warning(
"TCling__RegisterCxxModules",
"Global module index is%sused already!",
1260 (value) ?
" " :
" not ");
1261 supportedPlatform = value;
1264 if (supportedPlatform) {
1268 GlobalIndex = CI.getModuleManager()->getGlobalIndex();
1271 llvm::StringSet<> KnownModuleFileNames;
1273 GlobalIndex->getKnownModuleFileNames(KnownModuleFileNames);
1275 clang::Preprocessor &PP = CI.getPreprocessor();
1276 std::vector<std::string> PendingModules;
1277 PendingModules.reserve(256);
1278 ModuleMap &MMap = PP.getHeaderSearchInfo().getModuleMap();
1279 for (
auto I = MMap.module_begin(), E = MMap.module_end();
I != E; ++
I) {
1280 clang::Module *M =
I->second;
1284 std::string FullASTFilePath;
1288 if (GlobalIndex && KnownModuleFileNames.count(FullASTFilePath))
1291 if (M->IsMissingRequirement)
1299 if (std::find(CoreModules.begin(), CoreModules.end(), M->Name) != CoreModules.end())
1307 PendingModules.push_back(M->Name);
1314 assert(clingInterp.getMacro(
"gROOT") &&
"Couldn't load gROOT macro?");
1318 clingInterp.declare(R
"CODE(
1330 std::string PreIncludes;
1331 bool hasCxxModules = clingInterp.getCI()->getLangOpts().Modules;
1337 PreIncludes +=
"#include \"RtypesCore.h\"\n";
1340 PreIncludes +=
"#include \"Rtypes.h\"\n";
1342 PreIncludes += gClassDefInterpMacro +
"\n"
1343 + gInterpreterClassDef +
"\n"
1345 "#define ClassImp(X);\n";
1348 PreIncludes +=
"#include <string>\n";
1353 PreIncludes +=
"#include <cassert>\n";
1355 PreIncludes +=
"using namespace std;\n";
1356 clingInterp.declare(PreIncludes);
1374#ifdef R__USE_CXXMODULES
1378 llvm::install_fatal_error_handler(&exceptionErrorHandler);
1382 std::vector<std::string> clingArgsStorage;
1383 clingArgsStorage.push_back(
"cling4root");
1384 for (
const char*
const* arg = argv; *arg; ++arg)
1385 clingArgsStorage.push_back(*arg);
1388 if (!fromRootCling) {
1393 clingArgsStorage.push_back(
"-I" + interpInclude);
1396 clingArgsStorage.push_back(
"-I" + interpInclude +
"/cling");
1407 std::string pchFilename = interpInclude +
"/allDict.cxx.pch";
1412 clingArgsStorage.push_back(
"-include-pch");
1413 clingArgsStorage.push_back(pchFilename);
1416 clingArgsStorage.push_back(
"-Wno-undefined-inline");
1417 clingArgsStorage.push_back(
"-fsigned-char");
1421 llvm::Optional<std::string> EnvOpt = llvm::sys::Process::GetEnv(
"EXTRA_CLING_ARGS");
1422 if (EnvOpt.hasValue()) {
1423 StringRef Env(*EnvOpt);
1424 while (!Env.empty()) {
1426 std::tie(Arg, Env) = Env.split(
' ');
1427 clingArgsStorage.push_back(Arg.str());
1431 auto GetEnvVarPath = [](
const std::string &EnvVar,
1432 std::vector<std::string> &Paths) {
1433 llvm::Optional<std::string> EnvOpt = llvm::sys::Process::GetEnv(EnvVar);
1434 if (EnvOpt.hasValue()) {
1435 StringRef Env(*EnvOpt);
1436 while (!Env.empty()) {
1439 if (std::find(Paths.begin(), Paths.end(), Arg.str()) == Paths.end())
1440 Paths.push_back(Arg.str());
1446 std::vector<std::string> Paths;
1455 GetEnvVarPath(
"CLING_PREBUILT_MODULE_PATH", Paths);
1456 std::string EnvVarPath;
1457 for (
const std::string& P : Paths)
1460 gSystem->
Setenv(
"CLING_PREBUILT_MODULE_PATH", EnvVarPath.c_str());
1464 EnvOpt = llvm::sys::Process::GetEnv(
"ROOT_CLING_TIMING");
1465 if (EnvOpt.hasValue())
1466 clingArgsStorage.push_back(
"-ftime-report");
1473 std::vector<std::string> ModuleMaps;
1476 GetEnvVarPath(
"CLING_MODULEMAP_FILES", ModuleMaps);
1480 if (llvm::sys::fs::exists(cwd + ModuleMapSuffix))
1481 ModuleMaps.push_back(cwd + ModuleMapSuffix);
1483 for (
const std::string& M : ModuleMaps)
1484 clingArgsStorage.push_back(
"-fmodule-map-file=" + M);
1486 std::string ModulesCachePath;
1487 EnvOpt = llvm::sys::Process::GetEnv(
"CLING_MODULES_CACHE_PATH");
1488 if (EnvOpt.hasValue()){
1489 StringRef Env(*EnvOpt);
1490 assert(llvm::sys::fs::exists(Env) &&
"Path does not exist!");
1491 ModulesCachePath = Env.str();
1496 clingArgsStorage.push_back(
"-fmodules-cache-path=" + ModulesCachePath);
1499 std::vector<const char*> interpArgs;
1500 for (std::vector<std::string>::const_iterator iArg = clingArgsStorage.begin(),
1501 eArg = clingArgsStorage.end(); iArg != eArg; ++iArg)
1502 interpArgs.push_back(iArg->c_str());
1509 if (!fromRootCling) {
1511 interpArgs.push_back(
"-fmodules");
1512 interpArgs.push_back(
"-fno-implicit-module-maps");
1516 interpArgs.push_back(
"-Rmodule-build");
1522 interpArgs.push_back(
"-fno-autolink");
1527 interpArgs.push_back(
"-ffast-math");
1533 extraArgs && *extraArgs; ++extraArgs) {
1534 if (!strcmp(*extraArgs,
"-resource-dir")) {
1536 llvmResourceDir = *(++extraArgs);
1538 interpArgs.push_back(*extraArgs);
1543 interpArgs.push_back(arg.c_str());
1547 cling::Interpreter::ModuleFileExtensions extensions;
1548 EnvOpt = llvm::sys::Process::GetEnv(
"ROOTDEBUG_RDICT");
1549 if (!EnvOpt.hasValue())
1550 extensions.push_back(std::make_shared<TClingRdictModuleFileExtension>());
1552 fInterpreter = llvm::make_unique<cling::Interpreter>(interpArgs.size(),
1554 llvmResourceDir, extensions);
1557 fInterpreter->getCI()->getPreprocessorOpts().DisablePCHValidation =
true;
1561 fInterpreter->getCI()->getLangOpts().SpellChecking =
false;
1566 static llvm::raw_fd_ostream fMPOuts (STDOUT_FILENO,
false);
1586 if (!fromRootCling) {
1591 fInterpreter->getRuntimeOptions().AllowRedefinition = 1;
1596 std::unique_ptr<TClingCallbacks>
1602 if (!fromRootCling) {
1603 cling::DynamicLibraryManager& DLM = *
fInterpreter->getDynamicLibraryManager();
1607 auto ShouldPermanentlyIgnore = [](llvm::StringRef FileName) ->
bool{
1608 llvm::StringRef stem = llvm::sys::path::stem(FileName);
1609 return stem.startswith(
"libNew") || stem.startswith(
"libcppyy_backend");
1612 DLM.initializeDyld(ShouldPermanentlyIgnore);
1651 assert(
GetRootMapFiles() == 0 &&
"Must be called before LoadLibraryMap!");
1670 auto setFactory = []() {
1674 static bool doneFactory = setFactory();
1686 if (llvm::sys::fs::exists(pcmFileNameFullPath)) {
1687 ::Error(
"TCling::RegisterRdictForLoadPCM",
"Rdict '%s' is both in Module extension and in File system.", pcmFileNameFullPath.c_str());
1704 if (listOfKeys && ((listOfKeys->GetSize() == 0) ||
1705 ((listOfKeys->GetSize() == 1) &&
1706 !strcmp(((
TKey *)listOfKeys->At(0))->GetName(),
"EMPTY")
1713 ::Info(
"TCling::LoadPCMImpl",
"reading protoclasses for %s \n", pcmFile.
GetName());
1719 auto listOfGlobals =
gROOT->GetListOfGlobals();
1720 auto listOfEnums =
dynamic_cast<THashList *
>(
gROOT->GetListOfEnums());
1722 for (
auto selEnum : *enums) {
1723 const char *enumScope = selEnum->
GetTitle();
1724 const char *enumName = selEnum->GetName();
1725 if (strcmp(enumScope,
"") == 0) {
1728 if (!listOfEnums->THashList::FindObject(enumName)) {
1729 ((
TEnum *)selEnum)->SetClass(
nullptr);
1730 listOfEnums->Add(selEnum);
1732 for (
auto enumConstant : *
static_cast<TEnum *
>(selEnum)->GetConstants()) {
1733 if (!listOfGlobals->FindObject(enumConstant)) {
1734 listOfGlobals->Add(enumConstant);
1741 if (!nsTClassEntry) {
1744 auto listOfEnums = nsTClassEntry->
fEnums.load();
1755 if (listOfEnums && !listOfEnums->THashList::FindObject(enumName)) {
1756 ((
TEnum *)selEnum)->SetClass(nsTClassEntry);
1757 listOfEnums->Add(selEnum);
1765 pcmFile.
GetObject(
"__ProtoClasses", protoClasses);
1768 for (
auto obj : *protoClasses) {
1778 for (
auto proto : *protoClasses) {
1786 ::Error(
"TCling::LoadPCM",
"Inconsistent TClassTable for %s",
proto->GetName());
1797 protoClasses->
Clear();
1798 delete protoClasses;
1802 pcmFile.
GetObject(
"__Typedefs", dataTypes);
1804 for (
auto typedf : *dataTypes)
1805 gROOT->GetListOfTypes()->Add(typedf);
1818 assert(!pcmFileNameFullPath.empty());
1819 assert(llvm::sys::path::is_absolute(pcmFileNameFullPath));
1822 TString pcmFileName = pcmFileNameFullPath;
1830 llvm::SaveAndRestore<Int_t> SaveGDebug(
gDebug);
1833 ::Info(
"TCling::LoadPCM",
"Loading ROOT PCM %s", pcmFileName.
Data());
1838 if (llvm::sys::fs::is_symlink_file(pcmFileNameFullPath))
1843 llvm::StringRef pcmContent = pendingRdict->second;
1845 std::string RDictFileOpts = pcmFileNameFullPath +
"?filetype=pcm";
1846 TMemFile pcmMemFile(RDictFileOpts.c_str(), range);
1855 if (!llvm::sys::fs::exists(pcmFileNameFullPath)) {
1856 ::Error(
"TCling::LoadPCM",
"ROOT PCM %s file does not exist",
1857 pcmFileNameFullPath.data());
1860 ::Info(
"TCling::LoadPCM",
"In-memory ROOT PCM candidate %s\n",
1861 rdict.first.c_str());
1865 if (!
gROOT->IsRootFile(pcmFileName)) {
1866 Fatal(
"LoadPCM",
"The file %s is not a ROOT as was expected\n", pcmFileName.
Data());
1869 TFile pcmFile(pcmFileName +
"?filetype=pcm",
"READ");
1876 using namespace clang;
1878 class ExtLexicalStorageAdder:
public RecursiveASTVisitor<ExtLexicalStorageAdder>{
1883 bool VisitRecordDecl(clang::RecordDecl* rcd){
1885 Info(
"ExtLexicalStorageAdder",
1886 "Adding external lexical storage to class %s",
1887 rcd->getNameAsString().c_str());
1888 auto reDeclPtr = rcd->getMostRecentDecl();
1890 reDeclPtr->setHasExternalLexicalStorage();
1891 }
while ((reDeclPtr = reDeclPtr->getPreviousDecl()));
1904 const std::string &ModuleMapName )
const
1906 assert(llvm::sys::path::is_absolute(FullPath));
1907 Preprocessor &PP =
fInterpreter->getCI()->getPreprocessor();
1908 FileManager &FM = PP.getFileManager();
1911 const DirectoryEntry *DE = FM.getDirectory(FullPath);
1913 HeaderSearch &HS = PP.getHeaderSearchInfo();
1914 HeaderSearchOptions &HSOpts = HS.getHeaderSearchOpts();
1915 const auto &ModPaths = HSOpts.PrebuiltModulePaths;
1916 bool pathExists = std::find(ModPaths.begin(), ModPaths.end(), FullPath) != ModPaths.end();
1918 HSOpts.AddPrebuiltModulePath(FullPath);
1923 llvm::SmallString<256> ModuleMapFileName(DE->getName());
1924 llvm::sys::path::append(ModuleMapFileName, ModuleMapName);
1925 const FileEntry *FE = FM.getFile(ModuleMapFileName,
false,
1930 if (FE && !this->
IsLoaded(FE->getName().data())) {
1931 if (!HS.loadModuleMapFile(FE,
false))
1933 Error(
"RegisterPrebuiltModulePath",
"Could not load modulemap in %s", ModuleMapFileName.c_str());
1950 "libforward_listDict",
1958 "libunordered_setDict",
1959 "libunordered_multisetDict",
1960 "libunordered_mapDict",
1961 "libunordered_multimapDict",
1969 char dyLibError[1000];
1970 FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
1971 dyLibError,
sizeof(dyLibError), NULL);
1973 const char *dyLibError = dlerror();
1975 ::Error(
"TCling::RegisterModule",
"Cannot open shared library %s for dictionary %s:\n %s", dyLibName, modulename,
1976 (dyLibError) ? dyLibError :
"");
2013 const char** headers,
2014 const char** includePaths,
2015 const char* payloadCode,
2016 const char* fwdDeclsCode,
2017 void (*triggerFunc)(),
2019 const char** classesHeaders,
2020 Bool_t lateRegistration ,
2027 if (fromRootCling)
return;
2036 bool isACLiC = strstr(modulename,
"_ACLiC_dict") !=
nullptr;
2037 if (hasHeaderParsingOnDemand && isACLiC) {
2039 Info(
"TCling::RegisterModule",
2040 "Header parsing on demand is active but this is an Aclic library. Disabling it for this library.");
2041 hasHeaderParsingOnDemand =
false;
2055 for (
const char** inclPath = includePaths; *inclPath; ++inclPath) {
2058 cling::Transaction* T = 0;
2060 for (
auto& fwdDeclArgToSkipPair : fwdDeclsArgToSkip){
2061 const std::string& fwdDecl = fwdDeclArgToSkipPair.first;
2062 const int nArgsToSkip = fwdDeclArgToSkipPair.second;
2063 auto compRes =
fInterpreter->declare(fwdDecl.c_str(), &T);
2064 assert(cling::Interpreter::kSuccess == compRes &&
2065 "A fwd declaration could not be compiled");
2066 if (compRes!=cling::Interpreter::kSuccess){
2067 Warning(
"TCling::RegisterModule",
2068 "Problems in declaring string '%s' were encountered.",
2083 TString code = gNonInterpreterClassDef;
2085 code += payloadCode;
2087 std::string dyLibName = cling::DynamicLibraryManager::getSymbolLocation(triggerFunc);
2088 assert(!llvm::sys::fs::is_symlink_file(dyLibName));
2090 if (dyLibName.empty()) {
2091 ::Error(
"TCling::RegisterModule",
"Dictionary trigger function for %s not found", modulename);
2096 bool isSharedLib = cling::DynamicLibraryManager::isSharedLibrary(dyLibName);
2098 bool wasDlopened =
false;
2103 if (!lateRegistration) {
2110 void* dyLibHandle = dlopen(dyLibName.c_str(), RTLD_LAZY | RTLD_GLOBAL);
2120 if (hasHeaderParsingOnDemand && fwdDeclsCode){
2123 std::string fwdDeclsCodeLessEnums;
2127 std::string fwdDeclsLine;
2128 std::istringstream fwdDeclsCodeStr(fwdDeclsCode);
2129 std::vector<std::string> scopes;
2130 while (std::getline(fwdDeclsCodeStr, fwdDeclsLine)) {
2131 const auto enumPos = fwdDeclsLine.find(
"enum __attribute__((annotate(\"");
2133 if (enumPos != std::string::npos) {
2140 auto nsPos = fwdDeclsLine.find(
"namespace");
2141 R__ASSERT(nsPos < enumPos &&
"Inconsistent enum and enclosing scope parsing!");
2142 while (nsPos < enumPos && nsPos != std::string::npos) {
2144 const auto nsNameStart = nsPos + 10;
2145 const auto nsNameEnd = fwdDeclsLine.find(
'{', nsNameStart);
2146 const auto nsName = fwdDeclsLine.substr(nsNameStart, nsNameEnd - nsNameStart);
2147 scopes.push_back(nsName);
2148 nsPos = fwdDeclsLine.find(
"namespace", nsNameEnd);
2151 clang::DeclContext* DC = 0;
2152 for (
auto &&aScope: scopes) {
2153 DC = cling::utils::Lookup::Namespace(&
fInterpreter->getSema(), aScope.c_str(), DC);
2159 if (scopes.empty() || DC) {
2161 size_t posEnumName = fwdDeclsLine.find(
"\"))) ", 32);
2162 R__ASSERT(posEnumName != std::string::npos &&
"Inconsistent enum fwd decl!");
2164 while (isspace(fwdDeclsLine[posEnumName]))
2166 size_t posEnumNameEnd = fwdDeclsLine.find(
" : ", posEnumName);
2167 R__ASSERT(posEnumNameEnd != std::string::npos &&
"Inconsistent enum fwd decl (end)!");
2168 while (isspace(fwdDeclsLine[posEnumNameEnd]))
2172 std::string enumName = fwdDeclsLine.substr(posEnumName,
2173 posEnumNameEnd - posEnumName + 1);
2175 if (clang::NamedDecl* enumDecl
2176 = cling::utils::Lookup::Named(&
fInterpreter->getSema(),
2177 enumName.c_str(), DC)) {
2180 R__ASSERT(llvm::dyn_cast<clang::EnumDecl>(enumDecl) &&
"not an enum decl!");
2187 fwdDeclsCodeLessEnums += fwdDeclsLine +
"\n";
2191 if (!fwdDeclsCodeLessEnums.empty()){
2192 auto compRes =
fInterpreter->declare(fwdDeclsCodeLessEnums, &T);
2193 assert(cling::Interpreter::kSuccess == compRes &&
2194 "The forward declarations could not be compiled");
2195 if (compRes!=cling::Interpreter::kSuccess){
2196 Warning(
"TCling::RegisterModule",
2197 "Problems in compiling forward declarations for module %s: '%s'",
2198 modulename, fwdDeclsCodeLessEnums.c_str()) ;
2206 ExtLexicalStorageAdder elsa;
2207 for (
auto dciIt = T->decls_begin();dciIt!=T->decls_end();dciIt++){
2208 cling::Transaction::DelayCallInfo& dci = *dciIt;
2209 for(
auto dit = dci.m_DGR.begin(); dit != dci.m_DGR.end(); ++dit) {
2210 clang::Decl* declPtr = *dit;
2211 elsa.TraverseDecl(declPtr);
2225 for (
const char** classesHeader = classesHeaders; *classesHeader; ++classesHeader) {
2226 temp=*classesHeader;
2228 size_t theTemplateHash = 0;
2229 bool addTemplate =
false;
2230 size_t posTemplate = temp.find(
'<');
2231 if (posTemplate != std::string::npos) {
2233 std::string templateName = temp.substr(0, posTemplate);
2239 for (
const char** classesHeader_inner = classesHeader; 0!=strcmp(*classesHeader_inner,
"@"); ++classesHeader_inner,++classesHeader){
2241 if (payloadCode == *classesHeader_inner ){
2243 if (addTemplate)
fPayloads.insert(theTemplateHash);
2246 Info(
"TCling::RegisterModule",
2247 "Adding a header for %s", temp.c_str());
2253 addTemplate =
false;
2261 bool ModuleWasSuccessfullyLoaded =
false;
2263 std::string ModuleName = modulename;
2264 if (llvm::StringRef(modulename).startswith(
"lib"))
2265 ModuleName = llvm::StringRef(modulename).substr(3).str();
2270 clang::Preprocessor &PP = TheSema.getPreprocessor();
2271 std::string ModuleMapName;
2273 ModuleMapName = ModuleName +
".modulemap";
2275 ModuleMapName =
"module.modulemap";
2282 if (!ModuleWasSuccessfullyLoaded) {
2284 clang::HeaderSearch &headerSearch = PP.getHeaderSearchInfo();
2285 clang::ModuleMap &moduleMap = headerSearch.getModuleMap();
2286 if (moduleMap.findModule(ModuleName))
2287 Info(
"TCling::RegisterModule",
"Module %s in modulemap failed to load.", ModuleName.c_str());
2292 llvm::SmallString<256> pcmFileNameFullPath(dyLibName);
2295 llvm::sys::fs::make_absolute(pcmFileNameFullPath);
2296 llvm::sys::path::remove_filename(pcmFileNameFullPath);
2297 llvm::sys::path::append(pcmFileNameFullPath,
2299 LoadPCM(pcmFileNameFullPath.str().str());
2306 clangDiagSuppr diagSuppr(TheSema.getDiagnostics());
2308#if defined(R__MUST_REVISIT)
2309#if R__MUST_REVISIT(6,2)
2310 Warning(
"TCling::RegisterModule",
"Diagnostics suppression should be gone by now.");
2314 if (!ModuleWasSuccessfullyLoaded && !hasHeaderParsingOnDemand){
2317 const cling::Transaction* watermark =
fInterpreter->getLastTransaction();
2318 cling::Interpreter::CompilationResult compRes =
fInterpreter->parseForModule(code.
Data());
2324 assert(cling::Interpreter::kSuccess == compRes &&
2325 "Payload code of a dictionary could not be parsed correctly.");
2326 if (compRes!=cling::Interpreter::kSuccess) {
2327 Warning(
"TCling::RegisterModule",
2328 "Problems declaring payload for module %s.", modulename) ;
2341 if (!ModuleWasSuccessfullyLoaded && !hasHeaderParsingOnDemand) {
2344 "#undef __ROOTCLING__\n"
2345 + gInterpreterClassDef +
2350 assert(isSharedLib);
2353 dlclose(dyLibHandle);
2359 ASTContext &C = CI.getASTContext();
2367 if (IdentifierInfoLookup *External = C.Idents.getExternalIdentifierLookup()) {
2368 std::unique_ptr<IdentifierIterator> Iter(External->getIdentifiers());
2369 for (llvm::StringRef Ident = Iter->Next(); !Ident.empty(); Ident = Iter->Next()) {
2370 std::string
I = Ident.str();
2394 typedef std::vector<std::pair<TClass*,DictFuncPtr_t> >::iterator iterator;
2400 if ( i->first == oldcl ) {
2423 const char* input_line,
2424 cling::Interpreter::CompilationResult& compRes,
2425 cling::Value* result)
2428 return metaProcessor->process(input_line, compRes, result);
2430 catch (cling::InterpreterException&
ex)
2432 Error(
"HandleInterpreterException",
"%s.\n%s",
ex.what(),
"Execution of your code was aborted.");
2434 compRes = cling::Interpreter::kFailure;
2443 if (
auto ie =
dynamic_cast<const cling::InterpreterException*
>(&
e)) {
2469 gROOT->SetLineIsProcessing();
2473 gROOT->SetLineHasBeenProcessed();
2486 gROOT->SetLineIsProcessing();
2488 struct InterpreterFlagsRAII {
2489 cling::Interpreter* fInterpreter;
2490 bool fWasDynamicLookupEnabled;
2492 InterpreterFlagsRAII(cling::Interpreter* interp):
2493 fInterpreter(interp),
2494 fWasDynamicLookupEnabled(interp->isDynamicLookupEnabled())
2496 fInterpreter->enableDynamicLookup(
true);
2498 ~InterpreterFlagsRAII() {
2499 fInterpreter->enableDynamicLookup(fWasDynamicLookupEnabled);
2500 gROOT->SetLineHasBeenProcessed();
2508 cling::Value result;
2509 cling::Interpreter::CompilationResult compRes = cling::Interpreter::kSuccess;
2510 if (!strncmp(sLine.
Data(),
".L", 2) || !strncmp(sLine.
Data(),
".x", 2) ||
2511 !strncmp(sLine.
Data(),
".X", 2)) {
2519 aclicMode, arguments, io);
2520 if (aclicMode.
Length()) {
2522 R__ASSERT(aclicMode[0]==
'+' &&
"ACLiC mode must start with a +");
2524 if (aclicMode[1]==
'+') {
2530 compRes = cling::Interpreter::kFailure;
2532 if (strncmp(sLine.
Data(),
".L", 2) != 0) {
2535 if (arguments.
Length()==0) {
2544 mod_line = function + arguments + io;
2550 size_t unnamedMacroOpenCurly;
2553 std::string codeline;
2556 std::ifstream in(fname, std::ifstream::binary);
2558 std::getline(in, codeline);
2559 code += codeline +
"\n";
2561 unnamedMacroOpenCurly
2562 = cling::utils::isUnnamedMacro(code,
fInterpreter->getCI()->getLangOpts());
2566 if (unnamedMacroOpenCurly != std::string::npos) {
2568 unnamedMacroOpenCurly);
2578 if (0!=strncmp(sLine.
Data(),
".autodict ",10) && sLine !=
".autodict") {
2583 bool isInclusionDirective = sLine.
Contains(
"\n#include") || sLine.
BeginsWith(
"#include");
2584 if (isInclusionDirective) {
2592 if (result.isValid())
2601 case cling::Interpreter::kSuccess: *error =
kNoError;
break;
2602 case cling::Interpreter::kFailure: *error =
kRecoverable;
break;
2603 case cling::Interpreter::kMoreInputExpected: *error =
kProcessing;
break;
2606 if (compRes == cling::Interpreter::kSuccess
2608 && !result.isVoid())
2610 return result.simplisticCastAs<
long>();
2637 if (path[0] ==
'-' && path[1] ==
'I')
2662 static const TClassRef clRefString(
"std::string");
2663 if (clRefString == cl) {
2673 const char* cobj = (
const char*) obj;
2680 auto inspInspect = [&] (ptrdiff_t offset){
2686 switch(complexType) {
2693 inspInspect(
sizeof(
float));
2698 inspInspect(
sizeof(
double));
2703 inspInspect(
sizeof(
int));
2708 inspInspect(
sizeof(
long));
2713 static clang::PrintingPolicy
2715 if (printPol.Indentation) {
2717 printPol.Indentation = 0;
2718 printPol.SuppressInitializers =
true;
2721 const char* clname = cl->
GetName();
2724 const clang::ASTContext& astContext =
fInterpreter->getCI()->getASTContext();
2725 const clang::Decl *scopeDecl = 0;
2726 const clang::Type *recordType = 0;
2730 scopeDecl = clingCI->
GetDecl();
2731 recordType = clingCI->
GetType();
2733 const cling::LookupHelper& lh =
fInterpreter->getLookupHelper();
2735 scopeDecl = lh.findScope(clname, cling::LookupHelper::NoDiagnostics,
2739 Error(
"InspectMembers",
"Cannot find Decl for class %s", clname);
2742 const clang::CXXRecordDecl* recordDecl
2743 = llvm::dyn_cast<const clang::CXXRecordDecl>(scopeDecl);
2745 Error(
"InspectMembers",
"Cannot find Decl for class %s is not a CXXRecordDecl.", clname);
2754 astContext.getASTRecordLayout(recordDecl);
2756 for (clang::RecordDecl::field_iterator iField = recordDecl->field_begin(),
2757 eField = recordDecl->field_end(); iField != eField; ++iField) {}
2760 const clang::ASTRecordLayout& recLayout
2761 = astContext.getASTRecordLayout(recordDecl);
2768 if (cl->
Size() != recLayout.getSize().getQuantity()) {
2769 Error(
"InspectMembers",
"TClass and cling disagree on the size of the class %s, respectively %d %lld\n",
2773 unsigned iNField = 0;
2776 for (clang::RecordDecl::field_iterator iField = recordDecl->field_begin(),
2777 eField = recordDecl->field_end(); iField != eField;
2778 ++iField, ++iNField) {
2781 clang::QualType memberQT = iField->getType();
2786 memberQT = cling::utils::Transform::GetPartiallyDesugaredType(astContext, memberQT,
fNormalizedCtxt->
GetConfig(),
false );
2787 if (memberQT.isNull()) {
2788 std::string memberName;
2789 llvm::raw_string_ostream stream(memberName);
2791 printPol.AnonymousTagLocations =
false;
2792 iField->getNameForDiagnostic(stream, printPol,
true );
2794 Error(
"InspectMembers",
2795 "Cannot retrieve QualType for member %s while inspecting class %s",
2796 memberName.c_str(), clname);
2799 const clang::Type* memType = memberQT.getTypePtr();
2801 std::string memberName;
2802 llvm::raw_string_ostream stream(memberName);
2804 printPol.AnonymousTagLocations =
false;
2805 iField->getNameForDiagnostic(stream, printPol,
true );
2807 Error(
"InspectMembers",
2808 "Cannot retrieve Type for member %s while inspecting class %s",
2809 memberName.c_str(), clname);
2813 const clang::Type* memNonPtrType = memType;
2814 Bool_t ispointer =
false;
2815 if (memNonPtrType->isPointerType()) {
2817 clang::QualType ptrQT
2818 = memNonPtrType->getAs<clang::PointerType>()->getPointeeType();
2823 ptrQT = cling::utils::Transform::GetPartiallyDesugaredType(astContext, ptrQT,
fNormalizedCtxt->
GetConfig(),
false );
2824 if (ptrQT.isNull()) {
2825 std::string memberName;
2826 llvm::raw_string_ostream stream(memberName);
2828 printPol.AnonymousTagLocations =
false;
2829 iField->getNameForDiagnostic(stream, printPol,
true );
2831 Error(
"InspectMembers",
2832 "Cannot retrieve pointee Type for member %s while inspecting class %s",
2833 memberName.c_str(), clname);
2836 memNonPtrType = ptrQT.getTypePtr();
2840 llvm::SmallString<8> arraySize;
2841 const clang::ArrayType* arrType = memNonPtrType->getAsArrayTypeUnsafe();
2842 unsigned arrLevel = 0;
2843 bool haveErrorDueToArray =
false;
2847 const clang::ConstantArrayType* constArrType =
2848 clang::dyn_cast<clang::ConstantArrayType>(arrType);
2850 constArrType->getSize().toStringUnsigned(arraySize);
2853 clang::QualType subArrQT = arrType->getElementType();
2854 if (subArrQT.isNull()) {
2855 std::string memberName;
2856 llvm::raw_string_ostream stream(memberName);
2858 printPol.AnonymousTagLocations =
false;
2859 iField->getNameForDiagnostic(stream, printPol,
true );
2861 Error(
"InspectMembers",
2862 "Cannot retrieve QualType for array level %d (i.e. element type of %s) for member %s while inspecting class %s",
2863 arrLevel, subArrQT.getAsString(printPol).c_str(),
2864 memberName.c_str(), clname);
2865 haveErrorDueToArray =
true;
2868 arrType = subArrQT.getTypePtr()->getAsArrayTypeUnsafe();
2870 if (haveErrorDueToArray) {
2875 std::string fieldName;
2876 if (memType->isPointerType()) {
2881 std::string ioname(iField->getName());
2883 fieldName += ioname;
2884 fieldName += arraySize;
2889 clang::CharUnits offset(astContext.toCharUnitsFromBits(recLayout.getFieldOffset(iNField)));
2890 ptrdiff_t fieldOffset = offset.getQuantity();
2900 auto iFiledQtype = iField->getType();
2901 if (
auto tagDecl = iFiledQtype->getAsTagDecl()){
2902 auto declAccess = tagDecl->getAccess();
2903 if (declAccess == AS_private || declAccess == AS_protected) {
2909 insp.
Inspect(
const_cast<TClass*
>(cl), insp.
GetParent(), fieldName.c_str(), cobj + fieldOffset, isTransient);
2912 const clang::CXXRecordDecl* fieldRecDecl = memNonPtrType->getAsCXXRecordDecl();
2913 if (fieldRecDecl && !fieldRecDecl->isAnonymousStructOrUnion()) {
2916 std::string sFieldRecName;
2919 clang::QualType(memNonPtrType,0),
2929 insp.
InspectMember(sFieldRecName.c_str(), cobj + fieldOffset,
2930 (fieldName +
'.').c_str(), transient);
2938 unsigned iNBase = 0;
2939 for (clang::CXXRecordDecl::base_class_const_iterator iBase
2940 = recordDecl->bases_begin(), eBase = recordDecl->bases_end();
2941 iBase != eBase; ++iBase, ++iNBase) {
2942 clang::QualType baseQT = iBase->getType();
2943 if (baseQT.isNull()) {
2944 Error(
"InspectMembers",
2945 "Cannot find QualType for base number %d while inspecting class %s",
2949 const clang::CXXRecordDecl* baseDecl
2950 = baseQT->getAsCXXRecordDecl();
2952 Error(
"InspectMembers",
2953 "Cannot find CXXRecordDecl for base number %d while inspecting class %s",
2958 std::string sBaseName;
2960 std::vector<TClass*> foundClasses;
2962 if (foundClasses.size()==1){
2963 baseCl=foundClasses[0];
2976 std::string qualNameForDiag;
2978 Error(
"InspectMembers",
2979 "Cannot find TClass for base class %s", qualNameForDiag.c_str() );
2984 if (iBase->isVirtual()) {
2987 Error(
"InspectMembers",
2988 "Base %s of class %s is virtual but no object provided",
2989 sBaseName.c_str(), clname);
2997 baseOffset = ci->
GetBaseOffset(baseCi,
const_cast<void*
>(obj),
2999 if (baseOffset == -1) {
3000 Error(
"InspectMembers",
3001 "Error calculating offset of virtual base %s of class %s",
3002 sBaseName.c_str(), clname);
3005 Error(
"InspectMembers",
3006 "Cannot calculate offset of virtual base %s of class %s",
3007 sBaseName.c_str(), clname);
3012 baseOffset = recLayout.getBaseClassOffset(baseDecl).getQuantity();
3059 bool oldDynLookup =
fInterpreter->isDynamicLookupEnabled();
3088 return fInterpreter->getDynamicLibraryManager()->isLibraryLoaded(tLibName.
Data());
3103 llvm::StringRef ModuleName(libname);
3104 ModuleName = llvm::sys::path::stem(ModuleName);
3105 ModuleName.consume_front(
"lib");
3113 clang::ModuleMap &moduleMap =
fInterpreter->getCI()->getPreprocessor().getHeaderSearchInfo().getModuleMap();
3114 clang::Module *M = moduleMap.findModule(ModuleName);
3115 return M && !M->IsMissingRequirement && M->getASTFile();
3133 std::string file_name = filename;
3134 size_t at = std::string::npos;
3135 while ((at = file_name.find(
"/./")) != std::string::npos)
3136 file_name.replace(at, 3,
"/");
3138 std::string filesStr =
"";
3139 llvm::raw_string_ostream filesOS(filesStr);
3140 clang::SourceManager &SM =
fInterpreter->getCI()->getSourceManager();
3141 cling::ClangInternalState::printIncludedFiles(filesOS, SM);
3144 llvm::SmallVector<llvm::StringRef, 100> files;
3145 llvm::StringRef(filesStr).split(files,
"\n");
3147 std::set<std::string> fileMap;
3149 for (llvm::SmallVector<llvm::StringRef, 100>::const_iterator
3150 iF = files.begin(), iE = files.end(); iF != iE; ++iF) {
3151 if ((*iF) == file_name.c_str())
return kTRUE;
3152 fileMap.insert(*iF);
3155 if (fileMap.empty())
return kFALSE;
3158 TString sFilename(file_name.c_str());
3160 && fileMap.count(sFilename.
Data())) {
3168 while (incPath.
Index(
" :") != -1) {
3172 sFilename = file_name.c_str();
3174 && fileMap.count(sFilename.
Data())) {
3183 const clang::DirectoryLookup *CurDir = 0;
3184 clang::Preprocessor &PP =
fInterpreter->getCI()->getPreprocessor();
3185 clang::HeaderSearch &HS = PP.getHeaderSearchInfo();
3186 const clang::FileEntry *FE = HS.LookupFile(file_name.c_str(),
3187 clang::SourceLocation(),
3190 clang::ArrayRef<std::pair<
const clang::FileEntry *,
3191 const clang::DirectoryEntry *>>(),
3202 if (FE && FE->isValid()) {
3204 clang::SourceManager &SM =
fInterpreter->getCI()->getSourceManager();
3206 clang::FileID FID = SM.translateFile(FE);
3207 if (!FID.isInvalid() && FID.getHashValue() == 0)
3210 clang::SrcMgr::SLocEntry SLocE = SM.getSLocEntry(FID);
3211 if (SLocE.isFile() && SLocE.getFile().getContentCache()->getRawBuffer() == 0)
3213 if (!FID.isInvalid())
3217 sFilename = FE->getName();
3219 && fileMap.count(sFilename.
Data())) {
3227#if defined(R__MACOSX)
3235static bool R__UpdateLibFileForLinking(
TString &lib)
3237 const char *mapfile =
nullptr;
3239 mapfile =
"/System/Library/dyld/dyld_shared_cache_x86_64.map";
3241 mapfile =
"/System/Library/dyld/dyld_shared_cache_arm64e.map";
3243 #error unsupported architecture
3245 if (std::ifstream cacheMap{mapfile}) {
3247 while (getline(cacheMap,
line)) {
3248 if (
line.find(lib) != std::string::npos) {
3266static int callback_for_dl_iterate_phdr(
struct dl_phdr_info *info,
size_t size,
void *data)
3269 static std::unordered_set<
decltype(info->dlpi_addr)> sKnownLoadedLibBaseAddrs;
3271 auto newLibs =
static_cast<std::vector<std::string>*
>(data);
3272 if (!sKnownLoadedLibBaseAddrs.count(info->dlpi_addr)) {
3274 if (info->dlpi_name && info->dlpi_name[0]
3275 && strncmp(info->dlpi_name,
"linux-vdso.so", 13)
3276 && strncmp(info->dlpi_name,
"linux-vdso32.so", 15)
3277 && strncmp(info->dlpi_name,
"linux-vdso64.so", 15)
3278 && strncmp(info->dlpi_name,
"linux-gate.so", 13))
3279 newLibs->emplace_back(info->dlpi_name);
3280 sKnownLoadedLibBaseAddrs.insert(info->dlpi_addr);
3293#if defined(R__WIN32) || defined(__CYGWIN__)
3294 HMODULE hModules[1024];
3296 unsigned long cbModules;
3298 hProcess = (
void *)::GetCurrentProcess();
3299 ::EnumProcessModules(hProcess, hModules,
sizeof(hModules), &cbModules);
3301 for (i = 1; i < (cbModules /
sizeof(
void *)); i++) {
3302 static const int bufsize = 260;
3303 wchar_t winname[bufsize];
3304 char posixname[bufsize];
3305 ::GetModuleFileNameExW(hProcess, hModules[i], winname, bufsize);
3306#if defined(__CYGWIN__)
3307 cygwin_conv_path(CCP_WIN_W_TO_POSIX, winname, posixname, bufsize);
3309 std::wstring wpath = winname;
3310 std::replace(wpath.begin(), wpath.end(),
'\\',
'/');
3311 string path(wpath.begin(), wpath.end());
3312 strncpy(posixname, path.c_str(), bufsize);
3318#elif defined(R__MACOSX)
3322 while (
const mach_header* mh = _dyld_get_image_header(imageIndex)) {
3324 if (mh->filetype == MH_DYLIB) {
3325 if (
const char* imageName = _dyld_get_image_name(imageIndex)) {
3333#elif defined(R__LINUX)
3337 std::vector<std::string> newLibs;
3338 dl_iterate_phdr(callback_for_dl_iterate_phdr, &newLibs);
3339 for (
auto &&lib: newLibs)
3342 Error(
"TCling::UpdateListOfLoadedSharedLibraries",
3343 "Platform not supported!");
3354 if (!filename)
return;
3358 cling::DynamicLibraryManager* DLM =
fInterpreter->getDynamicLibraryManager();
3359 if (!DLM->isLibraryLoaded(filename)) {
3360 DLM->loadLibrary(filename,
true );
3363#if defined(R__MACOSX)
3365 auto lenFilename = strlen(filename);
3366 if (!strncmp(filename,
"/usr/lib/system/", 16)
3367 || !strncmp(filename,
"/usr/lib/libc++", 15)
3368 || !strncmp(filename,
"/System/Library/Frameworks/", 27)
3369 || !strncmp(filename,
"/System/Library/PrivateFrameworks/", 34)
3370 || !strncmp(filename,
"/System/Library/CoreServices/", 29)
3371 || !strcmp(filename,
"cl_kernels")
3372 || strstr(filename,
"/usr/lib/libSystem")
3373 || strstr(filename,
"/usr/lib/libstdc++")
3374 || strstr(filename,
"/usr/lib/libicucore")
3375 || strstr(filename,
"/usr/lib/libbsm")
3376 || strstr(filename,
"/usr/lib/libobjc")
3377 || strstr(filename,
"/usr/lib/libresolv")
3378 || strstr(filename,
"/usr/lib/libauto")
3379 || strstr(filename,
"/usr/lib/libcups")
3380 || strstr(filename,
"/usr/lib/libDiagnosticMessagesClient")
3381 || strstr(filename,
"/usr/lib/liblangid")
3382 || strstr(filename,
"/usr/lib/libCRFSuite")
3383 || strstr(filename,
"/usr/lib/libpam")
3384 || strstr(filename,
"/usr/lib/libOpenScriptingUtil")
3385 || strstr(filename,
"/usr/lib/libextension")
3386 || strstr(filename,
"/usr/lib/libAudioToolboxUtility")
3387 || strstr(filename,
"/usr/lib/liboah")
3388 || strstr(filename,
"/usr/lib/libRosetta")
3389 || strstr(filename,
"/usr/lib/libssl.")
3390 || strstr(filename,
"/usr/lib/libcrypto.")
3394 || (lenFilename > 4 && !strcmp(filename + lenFilename - 4,
".tbd")))
3397 R__UpdateLibFileForLinking(sFileName);
3398 filename = sFileName.
Data();
3399#elif defined(__CYGWIN__)
3401 static const int bufsize = 260;
3402 char posixwindir[bufsize];
3403 char *windir = getenv(
"WINDIR");
3405 cygwin_conv_path(CCP_WIN_A_TO_POSIX, windir, posixwindir, bufsize);
3407 snprintf(posixwindir,
sizeof(posixwindir),
"/Windows/");
3408 if (strstr(filename, posixwindir) ||
3409 strstr(filename,
"/usr/bin/cyg"))
3411#elif defined(R__WIN32)
3412 if (strstr(filename,
"/Windows/"))
3414#elif defined (R__LINUX)
3415 if (strstr(filename,
"/ld-linux")
3416 || strstr(filename,
"linux-gnu/")
3417 || strstr(filename,
"/libstdc++.")
3418 || strstr(filename,
"/libgcc")
3419 || strstr(filename,
"/libc.")
3420 || strstr(filename,
"/libdl.")
3421 || strstr(filename,
"/libm."))
3438 assert(!
IsFromRootCling() &&
"Trying to load library from rootcling!");
3442 cling::DynamicLibraryManager* DLM =
fInterpreter->getDynamicLibraryManager();
3443 std::string canonLib = DLM->lookupLibrary(filename);
3444 cling::DynamicLibraryManager::LoadLibResult res
3445 = cling::DynamicLibraryManager::kLoadLibNotFound;
3446 if (!canonLib.empty()) {
3448 res = DLM->loadLibrary(filename, system);
3452 cling::Interpreter::CompilationResult compRes;
3454 if (compRes == cling::Interpreter::kSuccess)
3455 res = cling::DynamicLibraryManager::kLoadLibSuccess;
3459 if (res == cling::DynamicLibraryManager::kLoadLibSuccess) {
3463 case cling::DynamicLibraryManager::kLoadLibSuccess:
return 0;
3464 case cling::DynamicLibraryManager::kLoadLibAlreadyLoaded:
return 1;
3514 Warning(
"Calc",
"waiting for cling thread to free");
3517 gROOT->SetLineIsProcessing();
3524 cling::Value valRef;
3525 cling::Interpreter::CompilationResult cr = cling::Interpreter::kFailure;
3529 catch (cling::InterpreterException&
ex)
3531 Error(
"Calc",
"%s.\n%s",
ex.what(),
"Evaluation of your expression was aborted.");
3533 cr = cling::Interpreter::kFailure;
3536 if (cr != cling::Interpreter::kSuccess) {
3544 if (!valRef.isValid()) {
3553 if (valRef.isVoid()) {
3560 gROOT->SetLineHasBeenProcessed();
3563 return valRef.simplisticCastAs<
long>();
3570 void (*histaddFunc)(
const char*
line))
3575#if defined(R__MUST_REVISIT)
3576#if R__MUST_REVISIT(6,2)
3577 Warning(
"SetGetline",
"Cling should support the equivalent of SetGetlineFunc(getlineFunc, histaddFunc)");
3590 if ((std::distance(T.decls_begin(), T.decls_end()) != 1)
3591 || T.deserialized_decls_begin() != T.deserialized_decls_end()
3592 || T.macros_begin() != T.macros_end()
3593 || ((!T.getFirstDecl().isNull()) && ((*T.getFirstDecl().begin()) != T.getWrapperFD()))) {
3616 std::set<TObject*>::iterator iSpecial = ((std::set<TObject*>*)
fgSetOfSpecials)->find(obj);
3634#if defined(R__MUST_REVISIT)
3635#if R__MUST_REVISIT(6,2)
3637 Warning(
"Reset",
"Cling should support the equivalent of scratch_upto(&fDictPos)");
3647#if defined(R__MUST_REVISIT)
3648#if R__MUST_REVISIT(6,2)
3650 Warning(
"ResetAll",
"Cling should support the equivalent of complete reset (unload everything but the startup decls.");
3677#if defined(R__MUST_REVISIT)
3678#if R__MUST_REVISIT(6,2)
3680 Warning(
"ResetGlobalVar",
"Cling should support the equivalent of resetglobalvar(obj)");
3692#if defined(R__MUST_REVISIT)
3693#if R__MUST_REVISIT(6,2)
3695 Warning(
"RewindDictionary",
"Cling should provide a way to revert transaction similar to rewinddictionary()");
3706#if defined(R__MUST_REVISIT)
3707#if R__MUST_REVISIT(6,2)
3709 Warning(
"DeleteGlobal",
"Cling should provide the equivalent of deleteglobal(obj), see also DeleteVariable.");
3721#if defined(R__MUST_REVISIT)
3722#if R__MUST_REVISIT(6,2)
3723 Warning(
"DeleteVariable",
"should do more that just reseting the value to zero");
3728 llvm::StringRef srName(
name);
3729 const char* unscopedName =
name;
3730 llvm::StringRef::size_type posScope = srName.rfind(
"::");
3731 const clang::DeclContext* declCtx = 0;
3732 if (posScope != llvm::StringRef::npos) {
3733 const cling::LookupHelper& lh =
fInterpreter->getLookupHelper();
3734 const clang::Decl* scopeDecl
3735 = lh.findScope(srName.substr(0, posScope),
3736 cling::LookupHelper::WithDiagnostics);
3738 Error(
"DeleteVariable",
"Cannot find enclosing scope for variable %s",
3742 declCtx = llvm::dyn_cast<clang::DeclContext>(scopeDecl);
3744 Error(
"DeleteVariable",
3745 "Enclosing scope for variable %s is not a declaration context",
3749 unscopedName += posScope + 2;
3753 clang::NamedDecl* nVarDecl
3754 = cling::utils::Lookup::Named(&
fInterpreter->getSema(), unscopedName, declCtx);
3756 Error(
"DeleteVariable",
"Unknown variable %s",
name);
3759 clang::VarDecl* varDecl = llvm::dyn_cast<clang::VarDecl>(nVarDecl);
3761 Error(
"DeleteVariable",
"Entity %s is not a variable",
name);
3765 clang::QualType qType = varDecl->getType();
3766 const clang::Type*
type = qType->getUnqualifiedDesugaredType();
3769 if (
type->isPointerType()) {
3770 int** ppInt = (
int**)
fInterpreter->getAddressOfGlobal(GlobalDecl(varDecl));
3772 if (ppInt) *ppInt = 0;
3782#if defined(R__MUST_REVISIT)
3783#if R__MUST_REVISIT(6,2)
3785 Warning(
"SaveContext",
"Cling should provide a way to record a state watermark similar to store_dictposition(&fDictPos)");
3795#if defined(R__MUST_REVISIT)
3796#if R__MUST_REVISIT(6,2)
3798 Warning(
"SaveGlobalsContext",
"Cling should provide a way to record a watermark for the list of global variable similar to store_dictposition(&fDictPosGlobals)");
3832struct AlternateTupleIntDoubleAsc
3838struct AlternateTupleIntDoubleDes
3846 std::tuple<int,double> value;
3847 AlternateTupleIntDoubleAsc asc;
3848 AlternateTupleIntDoubleDes des;
3850 size_t offset0 = ((
char*)&(std::get<0>(value))) - ((
char*)&value);
3851 size_t offset1 = ((
char*)&(std::get<1>(value))) - ((
char*)&value);
3853 size_t ascOffset0 = ((
char*)&(asc._0)) - ((
char*)&asc);
3854 size_t ascOffset1 = ((
char*)&(asc._1)) - ((
char*)&asc);
3856 size_t desOffset0 = ((
char*)&(des._0)) - ((
char*)&des);
3857 size_t desOffset1 = ((
char*)&(des._1)) - ((
char*)&des);
3859 if (offset0 == ascOffset0 && offset1 == ascOffset1) {
3861 }
else if (offset0 == desOffset0 && offset1 == desOffset1) {
3868static std::string
AlternateTuple(
const char *classname,
const cling::LookupHelper& lh)
3871 std::string alternateName =
"TEmulatedTuple";
3872 alternateName.append( classname + 5 );
3874 std::string fullname =
"ROOT::Internal::" + alternateName;
3875 if (lh.findScope(fullname, cling::LookupHelper::NoDiagnostics,
3879 std::string guard_name;
3881 std::ostringstream guard;
3882 guard <<
"ROOT_INTERNAL_TEmulated_";
3883 guard << guard_name;
3885 std::ostringstream alternateTuple;
3886 alternateTuple <<
"#ifndef " << guard.str() <<
"\n";
3887 alternateTuple <<
"#define " << guard.str() <<
"\n";
3888 alternateTuple <<
"namespace ROOT { namespace Internal {\n";
3889 alternateTuple <<
"template <class... Types> struct TEmulatedTuple;\n";
3890 alternateTuple <<
"template <> struct " << alternateName <<
" {\n";
3895 unsigned int nMember = 0;
3896 auto iter = tupleContent.
fElements.begin() + 1;
3897 auto theEnd = tupleContent.
fElements.end() - 1;
3898 while (iter != theEnd) {
3899 alternateTuple <<
" " << *iter <<
" _" << nMember <<
";\n";
3906 unsigned int nMember = tupleContent.
fElements.size() - 3;
3907 auto iter = tupleContent.
fElements.rbegin() + 1;
3908 auto theEnd = tupleContent.
fElements.rend() - 1;
3909 while (iter != theEnd) {
3910 alternateTuple <<
" " << *iter <<
" _" << nMember <<
";\n";
3917 Fatal(
"TCling::SetClassInfo::AlternateTuple",
3918 "Layout of std::tuple on this platform is unexpected.");
3923 alternateTuple <<
"};\n";
3924 alternateTuple <<
"}}\n";
3925 alternateTuple <<
"#endif\n";
3927 Error(
"Load",
"Could not declare %s",alternateName.c_str());
3930 alternateName =
"ROOT::Internal::" + alternateName;
3931 return alternateName;
3974 if (strncmp(cl->
GetName(),
"tuple<",strlen(
"tuple<"))==0) {
4010 zombieCandidate =
kTRUE;
4017 zombieCandidate =
kTRUE;
4071 static const char *anonEnum =
"anonymous enum ";
4072 static const int cmplen = strlen(anonEnum);
4099 const char *classname =
name;
4102 class MaybeSuspendAutoLoadParse {
4103 int fStoreAutoLoad = 0;
4104 int fStoreAutoParse = 0;
4105 bool fSuspendedAutoParse =
false;
4107 MaybeSuspendAutoLoadParse(
int autoload) {
4108 fStoreAutoLoad = ((
TCling*)
gCling)->SetClassAutoLoading(autoload);
4112 fSuspendedAutoParse =
true;
4113 fStoreAutoParse = ((
TCling*)
gCling)->SetSuspendAutoParsing(
true);
4116 ~MaybeSuspendAutoLoadParse() {
4117 if (fSuspendedAutoParse)
4118 ((
TCling*)
gCling)->SetSuspendAutoParsing(fStoreAutoParse);
4119 ((
TCling*)
gCling)->SetClassAutoLoading(fStoreAutoLoad);
4123 MaybeSuspendAutoLoadParse autoLoadParseRAII( autoload );
4125 autoLoadParseRAII.SuspendAutoParsing();
4134 const cling::LookupHelper& lh =
fInterpreter->getLookupHelper();
4135 const clang::Type *
type = 0;
4136 const clang::Decl *decl
4137 = lh.findScope(classname,
4138 gDebug > 5 ? cling::LookupHelper::WithDiagnostics
4139 : cling::LookupHelper::NoDiagnostics,
4143 decl = lh.findScope(buf,
4144 gDebug > 5 ? cling::LookupHelper::WithDiagnostics
4145 : cling::LookupHelper::NoDiagnostics,
4162 clang::ClassTemplateSpecializationDecl *tmpltDecl =
4163 llvm::dyn_cast_or_null<clang::ClassTemplateSpecializationDecl>
4164 (
type->getAsCXXRecordDecl());
4165 if (tmpltDecl && !tmpltDecl->getPointOfInstantiation().isValid()) {
4182 if (tci.
Property() & propertiesMask) {
4183 bool hasClassDefInline =
false;
4184 if (isClassOrNamespaceOnly) {
4190 if (hasDictionary.IsValid() && implLineFunc.IsValid()) {
4192 bool success =
false;
4193 std::tie(success, lineNumber) =
4195 hasClassDefInline = success && (lineNumber == -1);
4203 if (hasClassDefInline)
4242 const cling::LookupHelper& lh =
fInterpreter->getLookupHelper();
4243 const clang::Decl *decl
4244 = lh.findClassTemplate(
name,
4245 gDebug > 5 ? cling::LookupHelper::WithDiagnostics
4246 : cling::LookupHelper::NoDiagnostics);
4248 std::string strname =
"std::";
4250 decl = lh.findClassTemplate(strname,
4251 gDebug > 5 ? cling::LookupHelper::WithDiagnostics
4252 : cling::LookupHelper::NoDiagnostics);
4278 cl->
fBase = listOfBase;
4294 D =
fInterpreter->getCI()->getASTContext().getTranslationUnitDecl();
4297 if (
const clang::DeclContext* DC = dyn_cast<clang::DeclContext>(D)) {
4300 llvm::SmallVector< DeclContext *, 4> allDeclContexts;
4301 const_cast< clang::DeclContext *
>(DC)->collectAllContexts(allDeclContexts);
4302 for (llvm::SmallVector<DeclContext*, 4>::iterator declIter = allDeclContexts.begin(), declEnd = allDeclContexts.end();
4303 declIter != declEnd; ++declIter) {
4305 for (clang::DeclContext::decl_iterator DI = (*declIter)->decls_begin(),
4306 DE = (*declIter)->decls_end(); DI != DE; ++DI) {
4307 if (
const clang::EnumDecl* ED = dyn_cast<clang::EnumDecl>(*DI)) {
4310 PrintingPolicy Policy(ED->getASTContext().getPrintingPolicy());
4311 llvm::raw_string_ostream stream(buf);
4313 Policy.AnonymousTagLocations =
false;
4314 ED->getNameForDiagnostic(stream, Policy,
false);
4318 const char*
name = buf.c_str();
4342 D =
fInterpreter->getCI()->getASTContext().getTranslationUnitDecl();
4346 if (
const clang::DeclContext* DC = dyn_cast<clang::DeclContext>(D)) {
4349 llvm::SmallVector< DeclContext *, 4> allDeclContexts;
4350 const_cast< clang::DeclContext *
>(DC)->collectAllContexts(allDeclContexts);
4351 for (llvm::SmallVector<DeclContext*, 4>::iterator declIter = allDeclContexts.begin(),
4352 declEnd = allDeclContexts.end(); declIter != declEnd; ++declIter) {
4354 for (clang::DeclContext::decl_iterator DI = (*declIter)->decls_begin(),
4355 DE = (*declIter)->decls_end(); DI != DE; ++DI) {
4356 if (
const clang::FunctionTemplateDecl* FTD = dyn_cast<clang::FunctionTemplateDecl>(*DI)) {
4357 funcTempList->
Get(FTD);
4415 if (
m->fMethodArgs) {
4426 m->fMethodArgs = arglist;
4466 if (llvm::isa<clang::NamespaceDecl>(cli->
GetDecl())) {
4475 Error(
"GenerateTClass",
4476 "Cannot find %s::Class_Version()! Class version might be wrong.",
4483 if (newvers == -1) {
4491 newvers = callfunc.
ExecInt(0);
4493 Error(
"GenerateTClass",
4494 "Cannot invoke %s::Class_Version()! Class version might be wrong.",
4498 if (newvers != oldvers) {
4515static void GenerateTClass_GatherInnerIncludes(cling::Interpreter *interp,
TString &includes,
TClingClassInfo *info)
4519 const clang::ClassTemplateSpecializationDecl *templateCl
4520 = llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(info->
GetDecl());
4522 for(
unsigned int i=0; i < templateCl->getTemplateArgs().size(); ++i) {
4523 const clang::TemplateArgument &arg( templateCl->getTemplateArgs().get(i) );
4524 if (arg.getKind() == clang::TemplateArgument::Type) {
4527 if (!uType->isFundamentalType() && !uType->isEnumeralType()) {
4529 const clang::CXXRecordDecl *argdecl = uType->getAsCXXRecordDecl();
4532 TClingClassInfo subinfo(interp,*(argdecl->getASTContext().getRecordType(argdecl).getTypePtr()));
4533 GenerateTClass_GatherInnerIncludes(interp, includes, &subinfo);
4536 llvm::raw_string_ostream OS(Result);
4537 arg.print(argdecl->getASTContext().getPrintingPolicy(),OS);
4538 Warning(
"TCling::GenerateTClass",
"Missing header file for %s",OS.str().c_str());
4553 if (!info || !info->
IsValid()) {
4554 Fatal(
"GenerateTClass",
"Requires a valid ClassInfo object");
4559 std::string classname;
4563 Info(
"GenerateTClass",
"Will (try to) generate the compiled TClass for %s.",classname.c_str());
4567 GenerateTClass_GatherInnerIncludes(
fInterpreter,includes,info);
4573 Error(
"GenerateTClass",
"Even though the dictionary generation for %s seemed successful we can't find the TClass bootstrap!",classname.c_str());
4579 cl =
new TClass(classinfo, version, 0, 0, -1, -1, silent);
4585 cl =
new TClass(classinfo, 1, 0, 0, -1, -1, silent);
4610 if (classes == 0 || classes[0] == 0) {
4611 Error(
"TCling::GenerateDictionary",
"Cannot generate dictionary without passing classes.");
4615 std::vector<std::string> listClasses;
4617 const char* current = classes, *prev = classes;
4621 if (*current ==
';') {
4622 listClasses.push_back(std::string(prev, current - prev));
4625 else if (*(current + 1) == 0) {
4626 listClasses.push_back(std::string(prev, current + 1 - prev));
4630 std::vector<std::string> listIncludes;
4634 const char* current = includes, *prev = includes;
4638 if (*current ==
';') {
4639 listIncludes.push_back(std::string(prev, current - prev));
4642 else if (*(current + 1) == 0) {
4643 listIncludes.push_back(std::string(prev, current + 1 - prev));
4649 std::vector<std::string>(), std::vector<std::string>());
4670 if (
const ValueDecl* decl = (
const ValueDecl*)
d){
4673 if (hasIoName && ioName !=
name)
return 0;
4685 using namespace clang;
4687 DeclarationName DName = &SemaR.Context.Idents.get(
name);
4689 LookupResult
R(SemaR, DName, SourceLocation(), Sema::LookupOrdinaryName,
4690 Sema::ForExternalRedeclaration);
4694 cling::utils::Lookup::Named(&SemaR,
R);
4696 LookupResult::Filter
F =
R.makeFilter();
4698 while (
F.hasNext()) {
4699 NamedDecl *D =
F.next();
4700 if (isa<VarDecl>(D) || isa<FieldDecl>(D) || isa<EnumConstantDecl>(D) ||
4701 isa<IndirectFieldDecl>(D))
4707 if (
R.isSingleResult())
4708 return R.getFoundDecl();
4720 const clang::Decl* possibleEnum = 0;
4725 const clang::DeclContext* dc = 0;
4726 if (
const clang::Decl* D = cci->
GetDecl()) {
4727 if (!(dc = dyn_cast<clang::NamespaceDecl>(D))) {
4728 dc = dyn_cast<clang::RecordDecl>(D);
4735 possibleEnum = cling::utils::Lookup::Tag(&
fInterpreter->getSema(),
name, dc);
4737 Error(
"TCling::GetEnum",
"DeclContext not found for %s .\n",
name);
4746 if (possibleEnum && (possibleEnum != (clang::Decl*)-1)
4747 && isa<clang::EnumDecl>(possibleEnum)) {
4748 return possibleEnum;
4760 llvm::StringRef mangled_name = gv->getName();
4775 std::string scopename(demangled_name_c);
4776 free(demangled_name_c);
4782 std::string dataname;
4784 if (!strncmp(scopename.c_str(),
"typeinfo for ",
sizeof(
"typeinfo for ")-1)) {
4785 scopename.erase(0,
sizeof(
"typeinfo for ")-1);
4786 }
else if (!strncmp(scopename.c_str(),
"vtable for ",
sizeof(
"vtable for ")-1)) {
4787 scopename.erase(0,
sizeof(
"vtable for ")-1);
4790 std::string::size_type pos = scopename.rfind(
'(');
4791 if (pos != std::string::npos) {
4795 pos = scopename.rfind(
':');
4796 if (pos != std::string::npos) {
4797 if ((pos != 0) && (scopename[pos-1] ==
':')) {
4798 dataname = scopename.substr(pos+1);
4799 scopename.erase(pos-1);
4803 dataname = scopename;
4811 if (scopename.size()) {
4827 Error(
"GetDataMemberWithValue()",
"not implemented");
4837 Error(
"GetDataMemberAtAddr()",
"not implemented");
4847 const char* params,
Bool_t objectIsConst )
4859 func.
SetFunc(&gcl, method, params, &offset);
4865 return mangled_name;
4880 GetMethod(method,
proto, objectIsConst, 0 , mode).GetMangledName();
4892 const char* params,
Bool_t objectIsConst )
4904 func.
SetFunc(&gcl, method, params, &offset);
4933 std::vector<DeclId_t>& res)
const
4936 clang::ASTContext& Ctx = S.Context;
4937 const clang::Decl* CtxDecl
4939 Ctx.getTranslationUnitDecl();
4940 auto RecDecl = llvm::dyn_cast<const clang::RecordDecl>(CtxDecl);
4941 const clang::DeclContext* DeclCtx = RecDecl;
4944 DeclCtx = dyn_cast<clang::NamespaceDecl>(CtxDecl);
4945 if (!DeclCtx)
return;
4947 clang::DeclarationName DName;
4952 if (RecDecl->getNameAsString() == funcname) {
4953 clang::QualType QT = Ctx.getTypeDeclType(RecDecl);
4954 DName = Ctx.DeclarationNames.getCXXConstructorName(Ctx.getCanonicalType(QT));
4955 }
else if (funcname[0] ==
'~' && RecDecl->getNameAsString() == funcname + 1) {
4956 clang::QualType QT = Ctx.getTypeDeclType(RecDecl);
4957 DName = Ctx.DeclarationNames.getCXXDestructorName(Ctx.getCanonicalType(QT));
4959 DName = &Ctx.Idents.get(funcname);
4962 DName = &Ctx.Idents.get(funcname);
4966 clang::LookupResult
R(S, DName, clang::SourceLocation(),
4967 Sema::LookupOrdinaryName, clang::Sema::NotForRedeclaration);
4968 R.suppressDiagnostics();
4969 S.LookupQualifiedName(
R,
const_cast<DeclContext*
>(DeclCtx));
4970 if (
R.empty())
return;
4972 res.reserve(res.size() + (
R.end() -
R.begin()));
4973 for (clang::LookupResult::iterator IR =
R.begin(), ER =
R.end();
4975 if (
const clang::FunctionDecl* FD
4976 = llvm::dyn_cast<const clang::FunctionDecl>(*IR)) {
4977 if (!FD->getDescribedFunctionTemplate()) {
4980 }
else if (
const auto *USD = llvm::dyn_cast<const clang::UsingShadowDecl>(*IR)) {
4982 if (llvm::isa<clang::FunctionDecl>(USD->getTargetDecl())) {
5126 func.
SetFunc(&cl, function, params, &offset);
5142 const char* params,
Bool_t objectIsConst,
int* error)
5155 void* address = (
void*)((
Long_t)addr + offset);
5162 const char* params,
int* error)
5164 Execute(obj,cl,method,params,
false,error);
5179 Error(
"Execute",
"No method was defined");
5188 if (argc > nparms) {
5189 Error(
"Execute",
"Too many parameters to call %s, got %d but expected at most %d.",method->
GetName(),argc,nparms);
5192 if (nparms != argc) {
5202 Int_t firstDefault = -1;
5203 for (
Int_t i = 0; i < nparms; i ++) {
5210 if (firstDefault >= 0) {
5211 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);
5213 Error(
"Execute",
"Too few arguments to call %s, got only %d but expected %d.",method->
GetName(),argc,nparms);
5219 const char* listpar =
"";
5224 for (
Int_t i = 0; i < argc; i ++) {
5233 chpar += (nxtpar->
String()).ReplaceAll(
"\"",
"\\\"");
5240 complete += nxtpar->
String();
5243 listpar = complete.
Data();
5263 void* address = (
void*)((
Long_t)addr + offset);
5270 const void* args[] ,
5275 Error(
"ExecuteWithArgsAndReturn",
"No method was defined");
5302 Warning(
"GetTopLevelMacroName",
"Must change return type!");
5349#if defined(R__MUST_REVISIT)
5350#if R__MUST_REVISIT(6,0)
5351 Warning(
"GetCurrentMacroName",
"Must change return type!");
5364 TTHREAD_TLS(
char*) t = 0;
5365 TTHREAD_TLS(
unsigned int) tlen = 0;
5367 unsigned int dlen = strlen(typeDesc);
5370 t =
new char[dlen + 1];
5373 const char* s, *template_start;
5374 if (!strstr(typeDesc,
"(*)(")) {
5375 s = strchr(typeDesc,
' ');
5376 template_start = strchr(typeDesc,
'<');
5377 if (!strcmp(typeDesc,
"long long")) {
5378 strlcpy(t, typeDesc, dlen + 1);
5380 else if (!strncmp(typeDesc,
"unsigned ", s + 1 - typeDesc)) {
5381 strlcpy(t, typeDesc, dlen + 1);
5387 else if (s && (template_start == 0 || (s < template_start))) {
5388 strlcpy(t, s + 1, dlen + 1);
5391 strlcpy(t, typeDesc, dlen + 1);
5395 strlcpy(t, typeDesc, dlen + 1);
5398 while (
l > 0 && (t[
l - 1] ==
'*' || t[
l - 1] ==
'&')) {
5406 assert(rootmapfile && *rootmapfile);
5408 llvm::StringRef libName = llvm::sys::path::filename(rootmapfile);
5409 libName.consume_back(
".rootmap");
5411 return !
gInterpreter->HasPCMForLibrary(libName.str().c_str());
5422 if (!(rootmapfile && *rootmapfile))
5429 const std::map<char, unsigned int> keyLenMap = {{
'c',6},{
'n',10},{
't',8},{
'h',7},{
'e',5},{
'v',4}};
5431 std::string rootmapfileNoBackslash(rootmapfile);
5433 std::replace(rootmapfileNoBackslash.begin(), rootmapfileNoBackslash.end(),
'\\',
'/');
5440 std::string lineDirective = std::string(
"\n#line 2 \"Forward declarations from ") + rootmapfileNoBackslash +
"\"\n";
5442 std::ifstream
file(rootmapfileNoBackslash);
5445 std::string lib_name;
5447 bool newFormat =
false;
5448 while (getline(
file,
line,
'\n')) {
5449 if (!newFormat && (
line.compare(0, 8,
"Library.") == 0 ||
line.compare(0, 8,
"Declare.") == 0)) {
5455 if (
line.compare(0, 9,
"{ decls }") == 0) {
5458 while (getline(
file,
line,
'\n')) {
5461 if (!uniqueString) {
5462 Error(
"ReadRootmapFile",
"Cannot handle \"{ decls }\" sections in custom rootmap file %s",
5463 rootmapfileNoBackslash.c_str());
5466 if (!lineDirective.empty())
5467 uniqueString->
Append(lineDirective);
5471 const char firstChar =
line[0];
5472 if (firstChar ==
'[') {
5474 auto brpos =
line.find(
']');
5475 if (brpos == string::npos)
5477 lib_name =
line.substr(1, brpos - 1);
5479 while (lib_name[nspaces] ==
' ')
5482 lib_name.replace(0, nspaces,
"");
5484 TString lib_nameTstr(lib_name.c_str());
5489 Info(
"ReadRootmapFile",
"new section for %s", lib_nameTstr.
Data());
5491 Info(
"ReadRootmapFile",
"section for %s (library does not exist)", lib_nameTstr.
Data());
5497 auto keyLenIt = keyLenMap.find(firstChar);
5498 if (keyLenIt == keyLenMap.end())
5500 unsigned int keyLen = keyLenIt->second;
5502 const char *keyname =
line.c_str() + keyLen;
5504 Info(
"ReadRootmapFile",
"class %s in %s", keyname, lib_name.c_str());
5507 if (lib_name != isThere->
GetValue()) {
5508 if (firstChar ==
'n') {
5510 Info(
"ReadRootmapFile",
"namespace %s found in %s is already in %s", keyname, lib_name.c_str(),
5512 }
else if (firstChar ==
'h') {
5517 Warning(
"ReadRootmapFile",
"%s %s found in %s is already in %s",
line.substr(0, keyLen).c_str(),
5518 keyname, lib_name.c_str(), isThere->
GetValue());
5522 Info(
"ReadRootmapFile",
"Key %s was already defined for %s", keyname, lib_name.c_str());
5583 using namespace clang;
5585 class ExtVisibleStorageAdder:
public RecursiveASTVisitor<ExtVisibleStorageAdder>{
5591 ExtVisibleStorageAdder(std::unordered_set<const NamespaceDecl*>& nsSet): fNSSet(nsSet) {};
5592 bool VisitNamespaceDecl(NamespaceDecl* nsDecl) {
5597 nsDecl->setHasExternalVisibleStorage();
5598 fNSSet.insert(nsDecl);
5601 bool VisitClassTemplateSpecializationDecl(ClassTemplateSpecializationDecl* specDecl) {
5604 if (specDecl->getTemplateSpecializationKind() == TSK_ExplicitSpecialization)
5606 specDecl->setHasExternalLexicalStorage();
5618 std::unordered_set<const NamespaceDecl*>& fNSSet;
5665 for (
Int_t j = 0; j < i; j++) {
5676 Info(
"LoadLibraryMap",
"%s",
d.Data());
5681 if (
f.EndsWith(
".rootmap")) {
5687 Info(
"LoadLibraryMap",
" rootmap file: %s", p.
Data());
5705 if (
f.BeginsWith(
"rootmap")) {
5710 Warning(
"LoadLibraryMap",
"please rename %s to end with \".rootmap\"", p.
Data());
5723 if (rootmapfile && *rootmapfile) {
5730 else if (res == -3) {
5740 while ((rec = (
TEnvRec*) next())) {
5742 if (!strncmp(cls.
Data(),
"Library.", 8) && cls.
Length() > 8) {
5761 Info(
"LoadLibraryMap",
"class %s in %s", cls.
Data(), wlib);
5764 Info(
"LoadLibraryMap",
"class %s in %s (library does not exist)", cls.
Data(), lib);
5770 else if (!strncmp(cls.
Data(),
"Declare.", 8) && cls.
Length() > 8) {
5780 cling::Transaction* T =
nullptr;
5782 assert(cling::Interpreter::kSuccess == compRes &&
"A declaration in a rootmap could not be compiled");
5784 if (compRes!=cling::Interpreter::kSuccess){
5786 "Problems in %s declaring '%s' were encountered.", rootmapfile, uniqueString.
Data()) ;
5791 for (
auto declIt = T->decls_begin(); declIt < T->decls_end(); ++declIt) {
5792 if (declIt->m_DGR.isSingleDecl()) {
5793 if (Decl* D = declIt->m_DGR.getSingleDecl()) {
5794 if (clang::isa<TagDecl>(D) || clang::isa<NamespaceDecl>(D)) {
5795 evsAdder.TraverseDecl(D);
5830 for (
Int_t ilib = 0; ilib < nrSharedLibs; ilib++) {
5837 TString rootMapBaseStr = sharedLibBaseStr;
5838 if (sharedLibBaseStr.
EndsWith(
".dll")) {
5841 else if (sharedLibBaseStr.
EndsWith(
".DLL")) {
5844 else if (sharedLibBaseStr.
EndsWith(
".so")) {
5847 else if (sharedLibBaseStr.
EndsWith(
".sl")) {
5850 else if (sharedLibBaseStr.
EndsWith(
".dl")) {
5853 else if (sharedLibBaseStr.
EndsWith(
".a")) {
5857 Error(
"ReloadAllSharedLibraryMaps",
"Unknown library type %s", sharedLibBaseStr.
Data());
5861 rootMapBaseStr +=
".rootmap";
5864 Error(
"ReloadAllSharedLibraryMaps",
"Could not find rootmap %s in path", rootMapBaseStr.
Data());
5871 Error(
"ReloadAllSharedLibraryMaps",
"Error loading map %s", rootMap);
5906 if (!
fMapfile || !library || !*library) {
5914 size_t len = libname.
Length();
5919 while ((rec = (
TEnvRec *) next())) {
5930 if (!strncmp(cls.
Data(),
"Library.", 8) && cls.
Length() > 8) {
5939 if (!strncmp(lib, libname.
Data(), len)) {
5941 Error(
"UnloadLibraryMap",
"entry for <%s, %s> not found in library map table", cls.
Data(), lib);
5949 TString library_rootmap(library);
5950 if (!library_rootmap.
EndsWith(
".rootmap"))
5951 library_rootmap.
Append(
".rootmap");
6004 free(demangled_name);
6022 std::string demangled_name(demangled_name_c);
6023 free(demangled_name_c);
6036 result =
AutoLoad(demangled_name.c_str(), knowDictNotLoaded);
6055 if (
gROOT->LoadClass(cls, deplib) == 0) {
6058 "loaded dependent library %s for %s", deplib, cls);
6063 "failure loading dependent library %s for %s",
6068 if (lib && lib[0]) {
6069 if (
gROOT->LoadClass(cls, lib) == 0) {
6072 "loaded library %s for %s", lib, cls);
6078 "failure loading library %s for %s", lib, cls);
6093 bool nameIsNormalized)
6099 if (!visited.insert(std::string(cls)).second)
6109 for (
auto element :
proto->GetData()) {
6110 if (element->IsBasic())
6112 const char *subtypename = element->GetTypeName();
6128 if (classinfo &&
gInterpreter->ClassInfo_IsValid(classinfo)
6132 while (
gInterpreter->DataMemberInfo_Next(memberinfo)) {
6165 Info(
"TCling::AutoLoad",
"Explicitly disabled (the class name is %s)", cls);
6185 Info(
"TCling::AutoLoad",
6186 "Trying to autoload for %s", cls);
6191 Info(
"TCling::AutoLoad",
6192 "Disabled due to gROOT or gInterpreter being invalid/not ready (the class name is %s)", cls);
6213 std::unordered_set<std::string> visited;
6222 cling::Interpreter *interpreter)
6224 std::string code = gNonInterpreterClassDef ;
6231 code += (
"#include \"");
6235 code += (
"#ifdef __ROOTCLING__\n"
6236 "#undef __ROOTCLING__\n"
6237 + gInterpreterClassDef +
6240 cling::Interpreter::CompilationResult cr;
6246 Sema &SemaR = interpreter->getSema();
6248 clangDiagSuppr diagSuppr(SemaR.getDiagnostics());
6250 #if defined(R__MUST_REVISIT)
6251 #if R__MUST_REVISIT(6,2)
6252 Warning(
"TCling::RegisterModule",
"Diagnostics suppression should be gone by now.");
6256 cr = interpreter->parseForModule(code);
6274 Int_t nHheadersParsed = 0;
6275 unsigned long offset = 0;
6276 if (strncmp(cls,
"const ", 6) == 0) {
6281 bool skipFirstEntry =
false;
6282 std::vector<std::string> autoparseKeys;
6283 if (strchr(cls,
'<')) {
6289 if (!autoparseKeys.empty() && !autoparseKeys[0].empty()) {
6294 TString templateName(autoparseKeys[0]);
6295 auto tokens = templateName.
Tokenize(
"::");
6296 clang::NamedDecl* previousScopeAsNamedDecl =
nullptr;
6297 clang::DeclContext* previousScopeAsContext =
fInterpreter->getCI()->getASTContext().getTranslationUnitDecl();
6299 previousScopeAsContext =
fInterpreter->getSema().getStdNamespace();
6301 for (
Int_t tk = 0; tk < nTokens; ++tk) {
6302 auto scopeObj = tokens->UncheckedAt(tk);
6303 auto scopeName = ((
TObjString*) scopeObj)->String().Data();
6304 previousScopeAsNamedDecl = cling::utils::Lookup::Named(&
fInterpreter->getSema(), scopeName, previousScopeAsContext);
6306 if ((clang::NamedDecl*)-1 == previousScopeAsNamedDecl)
break;
6307 previousScopeAsContext = llvm::dyn_cast_or_null<clang::DeclContext>(previousScopeAsNamedDecl);
6308 if (!previousScopeAsContext)
break;
6312 if ((clang::NamedDecl*)-1 != previousScopeAsNamedDecl) {
6313 if (
auto templateDecl = llvm::dyn_cast_or_null<clang::ClassTemplateDecl>(previousScopeAsNamedDecl)) {
6314 if (
auto templatedDecl = templateDecl->getTemplatedDecl()) {
6315 skipFirstEntry = templatedDecl->hasDefinition();
6322 if (topLevel) autoparseKeys.emplace_back(cls);
6324 for (
const auto & apKeyStr : autoparseKeys) {
6325 if (skipFirstEntry) {
6326 skipFirstEntry=
false;
6329 if (apKeyStr.empty())
continue;
6330 const char *apKey = apKeyStr.c_str();
6334 Info(
"TCling::AutoParse",
6335 "Starting autoparse for %s\n", apKey);
6340 const cling::Transaction *T =
fInterpreter->getCurrentTransaction();
6342 auto const &hNamesPtrs = iter->second;
6344 Info(
"TCling::AutoParse",
6345 "We can proceed for %s. We have %s headers.", apKey, std::to_string(hNamesPtrs.size()).c_str());
6347 for (
auto & hName : hNamesPtrs) {
6349 if (0 !=
fPayloads.count(normNameHash)) {
6350 float initRSSval=0.f, initVSIZEval=0.f;
6352 (
void) initVSIZEval;
6355 "Parsing full payload for %s", apKey);
6362 if (cRes != cling::Interpreter::kSuccess) {
6363 if (hName[0] ==
'\n')
6364 Error(
"AutoParse",
"Error parsing payload code for class %s with content:\n%s", apKey, hName);
6373 Info(
"Autoparse",
">>> RSS key %s - before %.3f MB - after %.3f MB - delta %.3f MB", apKey, initRSSval, endRSSval, endRSSval-initRSSval);
6374 Info(
"Autoparse",
">>> VSIZE key %s - before %.3f MB - after %.3f MB - delta %.3f MB", apKey, initVSIZEval, endVSIZEval, endVSIZEval-initVSIZEval);
6380 "Parsing single header %s", hName);
6383 if (cRes != cling::Interpreter::kSuccess) {
6384 Error(
"AutoParse",
"Error parsing headerfile %s for class %s.", hName, apKey);
6396 if (strchr(apKey,
'<')) {
6403 return nHheadersParsed;
6413 if (llvm::StringRef(cls).contains(
"(lambda)"))
6427 Info(
"TCling::AutoParse",
6428 "Trying to autoparse for %s", cls);
6450 return nHheadersParsed > 0 ? 1 : 0;
6458 StringRef errMsg(errmessage);
6459 if (errMsg.contains(
"undefined symbol: ")) {
6461 std::string mangled_name = std::string(errMsg.split(
"undefined symbol: ").second);
6462 void* res = ((
TCling*)
gCling)->LazyFunctionCreatorAutoload(mangled_name);
6463 cling::DynamicLibraryManager* DLM =
fInterpreter->getDynamicLibraryManager();
6464 if (res && DLM && (DLM->loadLibrary(libStem, permanent, resolved) == cling::DynamicLibraryManager::kLoadLibSuccess))
6477 const cling::DynamicLibraryManager &DLM) {
6480 auto LibLoader = [](
const std::string& LibName) ->
bool {
6481 if (
gSystem->
Load(LibName.c_str(),
"",
false) < 0) {
6482 Error(
"TCling__LazyFunctionCreatorAutoloadForModule",
6483 "Failed to load library %s", LibName.c_str());
6493 assert(!llvm::StringRef(mangled_name).startswith(
"__") &&
"Already added!");
6494 std::string libName = DLM.searchLibrariesForSymbol(
'_' + mangled_name,
6497 std::string libName = DLM.searchLibrariesForSymbol(mangled_name,
6501 assert(!llvm::StringRef(libName).startswith(
"libNew") &&
6502 "We must not resolve symbols from libNew!");
6504 if (libName.empty())
6507 if (!LibLoader(libName))
6510 return llvm::sys::DynamicLibrary::SearchForAddressOfSymbol(mangled_name);
6527 mangled_name.c_str())) {
6538 std::string
name(demangled_name_c);
6539 free(demangled_name_c);
6547 std::string::size_type pos =
name.find(
"__thiscall ");
6548 if (pos != std::string::npos) {
6549 name.erase(0, pos +
sizeof(
"__thiscall ")-1);
6551 pos =
name.find(
"__cdecl ");
6552 if (pos != std::string::npos) {
6553 name.erase(0, pos +
sizeof(
"__cdecl ")-1);
6555 if (!strncmp(
name.c_str(),
"typeinfo for ",
sizeof(
"typeinfo for ")-1)) {
6556 name.erase(0,
sizeof(
"typeinfo for ")-1);
6557 }
else if (!strncmp(
name.c_str(),
"vtable for ",
sizeof(
"vtable for ")-1)) {
6558 name.erase(0,
sizeof(
"vtable for ")-1);
6559 }
else if (!strncmp(
name.c_str(),
"operator",
sizeof(
"operator")-1)
6560 && !isalnum(
name[
sizeof(
"operator")])) {
6562 name.erase(0,
sizeof(
"operator")-1);
6563 pos =
name.rfind(
'(');
6564 if (pos != std::string::npos) {
6565 name.erase(0, pos + 1);
6566 pos =
name.find(
",");
6567 if (pos != std::string::npos) {
6571 pos =
name.rfind(
" const");
6572 if (pos != std::string::npos) {
6573 name.erase(pos, strlen(
" const"));
6575 while (!
name.empty() && strchr(
"&*",
name.back()))
6595 while (libs.
Tokenize(lib, posLib)) {
6605 void* addr = llvm::sys::DynamicLibrary::SearchForAddressOfSymbol(mangled_name.c_str());
6627 const NamedDecl *oldDef = llvm::dyn_cast_or_null<NamedDecl>(cci->
GetDecl());
6628 if (!oldDef || (def && def != oldDef)) {
6642 if (!alias && def !=
nullptr)
6665 const TagDecl *td = dyn_cast<TagDecl>(ND);
6666 const NamespaceDecl *ns = dyn_cast<NamespaceDecl>(ND);
6667 const NamedDecl *canon =
nullptr;
6672 canon = tdDef = td->getDefinition();
6676 if (!tdDef->isCompleteDefinition() || llvm::isa<clang::FunctionDecl>(tdDef->getDeclContext())) {
6682 auto declName = tdDef->getNameAsString();
6693 clang::QualType
type(tdDef->getTypeForDecl(), 0);
6696 canon = ns->getCanonicalDecl();
6697 name = ND->getQualifiedNameAsString();
6699 name = ND->getQualifiedNameAsString();
6748 std::set<TClass*> modifiedTClasses;
6753 bool isTUTransaction =
false;
6754 if (!T.empty() && T.decls_begin() + 1 == T.decls_end() && !T.hasNestedTransactions()) {
6755 clang::Decl* FirstDecl = *(T.decls_begin()->m_DGR.begin());
6756 if (llvm::isa<clang::TranslationUnitDecl>(FirstDecl)) {
6759 isTUTransaction =
true;
6763 std::set<const void*> TransactionDeclSet;
6764 if (!isTUTransaction && T.decls_end() - T.decls_begin()) {
6765 const clang::Decl* WrapperFD = T.getWrapperFD();
6766 for (cling::Transaction::const_iterator
I = T.decls_begin(), E = T.decls_end();
6768 if (
I->m_Call != cling::Transaction::kCCIHandleTopLevelDecl
6769 &&
I->m_Call != cling::Transaction::kCCIHandleTagDeclDefinition)
6772 for (DeclGroupRef::const_iterator DI =
I->m_DGR.begin(),
6773 DE =
I->m_DGR.end(); DI != DE; ++DI) {
6774 if (*DI == WrapperFD)
6776 TransactionDeclSet.insert(*DI);
6777 ((
TCling*)
gCling)->HandleNewDecl(*DI,
false, modifiedTClasses);
6784 for (cling::Transaction::const_iterator
I = T.deserialized_decls_begin(),
6785 E = T.deserialized_decls_end();
I != E; ++
I) {
6786 for (DeclGroupRef::const_iterator DI =
I->m_DGR.begin(),
6787 DE =
I->m_DGR.end(); DI != DE; ++DI)
6788 if (TransactionDeclSet.find(*DI) == TransactionDeclSet.end()) {
6804 std::vector<TClass*> modifiedTClassesDiff(modifiedTClasses.size());
6805 std::vector<TClass*>::iterator it;
6806 it = set_difference(modifiedTClasses.begin(), modifiedTClasses.end(),
6809 modifiedTClassesDiff.begin());
6810 modifiedTClassesDiff.resize(it - modifiedTClassesDiff.begin());
6813 ((
TCling*)
gCling)->GetModTClasses().insert(modifiedTClassesDiff.begin(),
6814 modifiedTClassesDiff.end());
6815 for (std::vector<TClass*>::const_iterator
I = modifiedTClassesDiff.begin(),
6816 E = modifiedTClassesDiff.end();
I != E; ++
I) {
6818 if (!
gROOT->GetListOfClasses()->FindObject(*
I)) {
6840 cling::Transaction::const_nested_iterator iNested = T.nested_begin();
6841 for (cling::Transaction::const_iterator
I = T.decls_begin(), E = T.decls_end();
6843 if (
I->m_Call == cling::Transaction::kCCIHandleVTable)
6845 if (
I->m_Call == cling::Transaction::kCCINone) {
6851 for (
auto &D :
I->m_DGR)
6877 if (D->isFromASTFile())
6885 if (isa<VarDecl>(D) || isa<FieldDecl>(D) || isa<EnumConstantDecl>(D)) {
6891 }
else if (isa<FunctionDecl>(D)) {
6893 }
else if (isa<FunctionTemplateDecl>(D)) {
6895 }
else if (isa<EnumDecl>(D)) {
6906 }
else if (isa<RecordDecl>(D) || isa<NamespaceDecl>(D)) {
6907 if (isa<RecordDecl>(D) && !cast<RecordDecl>(D)->isCompleteDefinition())
6910 std::vector<TClass *> Classes;
6913 for (
auto &C : Classes) {
6918 for (
auto &
I : cast<DeclContext>(D)->decls())
6922 if (D->getKind() != Decl::Namespace
6923 || cast<NamespaceDecl>(D)->isOriginalNamespace())
6924 C->ResetClassInfo();
6936 std::size_t normNameHash = triter->second;
6942 auto const &hNamesPtrs = iter->second;
6943 for (
auto &hName : hNamesPtrs) {
6945 Info(
"TransactionRollback",
6946 "Restoring ability to autoaparse: %s", hName);
6983 using namespace clang;
6984 if (
const Decl *D = LH.findScope(cls, cling::LookupHelper::NoDiagnostics,
6986 if (!D->isFromASTFile()) {
6988 Warning(
"GetClassSharedLibsForModule",
"Decl found for %s is not part of a module", cls);
6991 class ModuleCollector :
public ConstDeclVisitor<ModuleCollector> {
6992 llvm::DenseSet<Module *> &m_TopLevelModules;
6995 ModuleCollector(llvm::DenseSet<Module *> &TopLevelModules) : m_TopLevelModules(TopLevelModules) {}
6996 void Collect(
const Decl *D) { Visit(D); }
6998 void VisitDecl(
const Decl *D)
7008 if (!D->hasOwningModule())
7010 if (Module *M = D->getOwningModule()->getTopLevelModule())
7011 m_TopLevelModules.insert(M);
7014 void VisitTemplateArgument(
const TemplateArgument &TA)
7016 switch (TA.getKind()) {
7017 case TemplateArgument::Null:
7018 case TemplateArgument::Integral:
7019 case TemplateArgument::Pack:
7020 case TemplateArgument::NullPtr:
7021 case TemplateArgument::Expression:
7022 case TemplateArgument::Template:
7023 case TemplateArgument::TemplateExpansion:
return;
7024 case TemplateArgument::Type:
7025 if (
const TagType *TagTy = dyn_cast<TagType>(TA.getAsType()))
7026 return Visit(TagTy->getDecl());
7028 case TemplateArgument::Declaration:
return Visit(TA.getAsDecl());
7030 llvm_unreachable(
"Invalid TemplateArgument::Kind!");
7033 void VisitClassTemplateSpecializationDecl(
const ClassTemplateSpecializationDecl *CTSD)
7035 if (CTSD->getOwningModule())
7038 VisitDecl(CTSD->getSpecializedTemplate());
7039 const TemplateArgumentList &ArgList = CTSD->getTemplateArgs();
7040 for (
const TemplateArgument *Arg = ArgList.data(), *ArgEnd = Arg + ArgList.size(); Arg != ArgEnd; ++Arg) {
7041 VisitTemplateArgument(*Arg);
7046 llvm::DenseSet<Module *> TopLevelModules;
7047 ModuleCollector
m(TopLevelModules);
7050 for (
auto M : TopLevelModules) {
7053 if (!M->LinkLibraries.size())
7056 if (M->Name ==
"Core")
7058 assert(M->LinkLibraries.size() == 1);
7059 if (!result.empty())
7061 result += M->LinkLibraries[0].Library;
7077 llvm::StringRef className = cls;
7083 if (className.contains(
"(lambda)"))
7087 cling::LookupHelper &LH =
fInterpreter->getLookupHelper();
7089 if (!libs.empty()) {
7095 if (!cls || !*cls) {
7103 const char* libs = libs_record->
GetValue();
7104 return (*libs) ? libs : 0;
7121 const char* libs = libs_record->
GetValue();
7122 return (*libs) ? libs : 0;
7136 cling::Interpreter *interp,
7137 bool skipLoadedLibs =
true)
7140 if (!llvm::sys::path::is_absolute(lib)) {
7142 Error(
"TCling__GetSharedLibImmediateDepsSlow",
"Cannot find library '%s'", lib.c_str());
7146 assert(llvm::sys::fs::exists(lib) &&
"Must exist!");
7147 lib = llvm::sys::path::filename(lib);
7150 auto ObjF = llvm::object::ObjectFile::createObjectFile(LibFullPath.
Data());
7152 Warning(
"TCling__GetSharedLibImmediateDepsSlow",
"Failed to read object file %s", lib.c_str());
7156 llvm::object::ObjectFile *BinObjFile = ObjF.get().getBinary();
7158 std::set<string> DedupSet;
7159 std::string Result = lib +
' ';
7160 for (
const auto &S : BinObjFile->symbols()) {
7161 uint32_t Flags = S.getFlags();
7162 if (Flags & llvm::object::SymbolRef::SF_Undefined) {
7163 llvm::Expected<StringRef> SymNameErr = S.getName();
7165 Warning(
"GetSharedLibDepsForModule",
"Failed to read symbol");
7168 llvm::StringRef SymName = SymNameErr.get();
7169 if (SymName.empty())
7172 if (BinObjFile->isELF()) {
7176 if (SymName.contains(
"@@GLIBCXX") || SymName.contains(
"@@CXXABI") ||
7177 SymName.contains(
"@@GLIBC") || SymName.contains(
"@@GCC"))
7185 if (SymName ==
"_Jv_RegisterClasses" ||
7186 SymName ==
"_ITM_deregisterTMCloneTable" ||
7187 SymName ==
"_ITM_registerTMCloneTable")
7195 if (skipLoadedLibs && SymName[0] ==
'_'
7196 && llvm::sys::DynamicLibrary::SearchForAddressOfSymbol(SymName.drop_front()))
7201 if (skipLoadedLibs && llvm::sys::DynamicLibrary::SearchForAddressOfSymbol(SymName))
7205 std::string found = interp->getDynamicLibraryManager()->searchLibrariesForSymbol(SymName,
false);
7211 if (!found.empty()) {
7212 std::string cand = llvm::sys::path::filename(found).str();
7213 if (!DedupSet.insert(cand).second)
7216 Result += cand +
' ';
7227 llvm::SmallString<256> rootmapName;
7228 if (!lib.startswith(
"lib"))
7229 rootmapName.append(
"lib");
7231 rootmapName.append(llvm::sys::path::filename(lib));
7232 llvm::sys::path::replace_extension(rootmapName,
"rootmap");
7238 llvm::StringRef rootmapNameNoLib = rootmapName.str();
7239 if (rootmapNameNoLib.consume_front(
"lib"))
7263 if (llvm::sys::path::is_absolute(lib) && !llvm::sys::fs::exists(lib))
7267 llvm::SmallString<512> rootmapName(lib);
7268 llvm::sys::path::replace_extension(rootmapName,
"rootmap");
7269 if (llvm::sys::fs::exists(rootmapName)) {
7271 Info(
"Load",
"loading %s", rootmapName.c_str());
7278 Warning(
"TCling::GetSharedLibDeps",
"Precomputed dependencies available but scanning '%s'", lib);
7283 if (!libs.empty()) {
7289 if (!
fMapfile || !lib || !lib[0]) {
7299 size_t len = libname.
Length();
7300 while ((rec = (
TEnvRec*) next())) {
7301 const char* libs = rec->
GetValue();
7302 if (!strncmp(libs, libname.
Data(), len) && strlen(libs) >= len
7303 && (!libs[len] || libs[len] ==
' ' || libs[len] ==
'.')) {
7316#if defined(R__MUST_REVISIT)
7317#if R__MUST_REVISIT(6,2)
7318 Warning(
"IsErrorMessagesEnabled",
"Interface not available yet.");
7330#if defined(R__MUST_REVISIT)
7331#if R__MUST_REVISIT(6,2)
7332 Warning(
"SetErrorMessages",
"Interface not available yet.");
7348 llvm::SmallVector<std::string, 10> includePaths;
7350 fInterpreter->GetIncludePaths(includePaths,
false,
true);
7351 if (
const size_t nPaths = includePaths.size()) {
7352 assert(!(nPaths & 1) &&
"GetIncludePath, number of paths and options is not equal");
7354 for (
size_t i = 0; i < nPaths; i += 2) {
7359 if (includePaths[i] !=
"-I")
7393 assert(fout != 0 &&
"DisplayIncludePath, 'fout' parameter is null");
7395 llvm::SmallVector<std::string, 10> includePaths;
7397 fInterpreter->GetIncludePaths(includePaths,
false,
true);
7398 if (
const size_t nPaths = includePaths.size()) {
7399 assert(!(nPaths & 1) &&
"DisplayIncludePath, number of paths and options is not equal");
7401 std::string allIncludes(
"include path:");
7402 for (
size_t i = 0; i < nPaths; i += 2) {
7404 allIncludes += includePaths[i];
7406 if (includePaths[i] !=
"-I")
7408 allIncludes += includePaths[i + 1];
7411 fprintf(fout,
"%s\n", allIncludes.c_str());
7430#if defined(R__MUST_REVISIT)
7431#if R__MUST_REVISIT(6,2)
7432 Warning(
"GenericError",
"Interface not available yet.");
7460#if defined(R__MUST_REVISIT)
7461#if R__MUST_REVISIT(6,2)
7462 Warning(
"GetSecurityError",
"Interface not available yet.");
7473 cling::Interpreter::CompilationResult compRes;
7475 return compRes == cling::Interpreter::kFailure;
7494 TTHREAD_TLS_DECL(std::string,buffer);
7496 return buffer.c_str();
7577#if defined(R__MUST_REVISIT)
7578#if R__MUST_REVISIT(6,2)
7579 Warning(
"SetErrmsgcallback",
"Interface not available yet.");
7588 &
fInterpreter->getDiagnostics().getDiagnosticOptions(),
7590 [] (clang::DiagnosticsEngine::Level Level,
const std::string &
Info) {
7591 if (Level == clang::DiagnosticsEngine::Warning) {
7592 ::Warning(
"cling",
"%s", Info.c_str());
7593 }
else if (Level == clang::DiagnosticsEngine::Error
7594 || Level == clang::DiagnosticsEngine::Fatal) {
7600 fInterpreter->replaceDiagnosticConsumer(consumer,
true);
7602 fInterpreter->replaceDiagnosticConsumer(
nullptr);
7619 cling::DynamicLibraryManager* DLM =
fInterpreter->getDynamicLibraryManager();
7620 std::string canonical = DLM->lookupLibrary(path);
7621 if (canonical.empty()) {
7625 cling::Interpreter::CompilationResult compRes;
7627 return compRes == cling::Interpreter::kFailure;
7631 return std::unique_ptr<TInterpreterValue>(
new TClingValue);
7638 std::vector<std::string>& completions)
7647 auto V =
reinterpret_cast<cling::Value*
>(value.
GetValAddr());
7649 return compRes!=cling::Interpreter::kSuccess ? 0 : 1 ;
7656 using namespace cling;
7670 if (value.isValid() && value.needsManagedAllocation()) {
7691 auto iSpecObj = iSpecObjMap->second.find(Name);
7692 if (iSpecObj != iSpecObjMap->second.end()) {
7694 return iSpecObj->second;
7701 ASTContext& C = SemaR.getASTContext();
7702 Preprocessor &PP = SemaR.getPreprocessor();
7703 Parser& P =
const_cast<Parser&
>(
fInterpreter->getParser());
7704 Preprocessor::CleanupAndRestoreCacheRAII cleanupRAII(PP);
7705 Parser::ParserCurTokRestoreRAII savedCurToken(P);
7708 Token& Tok =
const_cast<Token&
>(P.getCurToken());
7709 Tok.setKind(tok::semi);
7715 Sema::ContextAndScopeRAII pushedDCAndS(SemaR, C.getTranslationUnitDecl(),
7718 TObject* specObj =
gROOT->FindSpecialObject(Name, LookupCtx);
7721 Error(
"GetObjectAddress",
"Got a special object without LookupCtx!");
7735 clang::CXXRecordDecl* klass)
const
7737 using namespace clang;
7738 ASTContext& Ctx = klass->getASTContext();
7739 FriendDecl::FriendUnion friendUnion(function);
7742 FriendDecl* friendDecl = FriendDecl::Create(Ctx, klass, sl, friendUnion, sl);
7743 klass->pushFriendDecl(friendDecl);
7757 if (func)
return ((
TClingCallFunc*)func)->GetDecl()->getCanonicalDecl();
7828 f->
Exec(address, &val);
7842 const void* args[] ,
8009 f->SetFunc(ci, method, params, offset);
8018 f->SetFunc(ci, method, params, objectIsConst, offset);
8036 f->SetFuncProto(ci, method,
proto, offset, mode);
8046 f->SetFuncProto(ci, method,
proto, objectIsConst, offset, mode);
8056 llvm::SmallVector<clang::QualType, 4> funcProto;
8057 for (std::vector<TypeInfo_t*>::const_iterator iter =
proto.begin(), end =
proto.end();
8058 iter != end; ++iter) {
8059 funcProto.push_back( ((
TClingTypeInfo*)(*iter))->GetQualType() );
8061 f->SetFuncProto(ci, method, funcProto, offset, mode);
8071 llvm::SmallVector<clang::QualType, 4> funcProto;
8072 for (std::vector<TypeInfo_t*>::const_iterator iter =
proto.begin(), end =
proto.end();
8073 iter != end; ++iter) {
8074 funcProto.push_back( ((
TClingTypeInfo*)(*iter))->GetQualType() );
8076 f->SetFuncProto(ci, method, funcProto, objectIsConst, offset, mode);
8082 std::string wrapper_name;
8083 std::string wrapper;
8103 const clang::DeclContext *ctxt =
nullptr;
8105 ctxt = clang::Decl::castToDeclContext(((
TClingClassInfo*)info)->GetDecl());
8107 ctxt =
fInterpreter->getCI()->getASTContext().getTranslationUnitDecl();
8112 const clang::Decl *decl =
reinterpret_cast<const clang::Decl*
>(declid);
8116 const clang::DeclContext *declDC = decl->getDeclContext();
8119 if (declDC->isTransparentContext()) {
8120 declDC = declDC->getParent();
8123 if (
const auto *declRD = llvm::dyn_cast<clang::RecordDecl>(declDC)) {
8124 if (declRD->isAnonymousStructOrUnion()) {
8125 declDC = declRD->getParent();
8129 if (
const auto *declNS = llvm::dyn_cast<clang::NamespaceDecl>(declDC)) {
8130 if (declNS->isAnonymousNamespace() || declNS->isInlineNamespace()) {
8131 declDC = declNS->getParent();
8138 return declDC->Equals(ctxt);
8249 TClinginfo->
Init(tagnum);
8322 return TClinginfo->
Next();
8370 return TClinginfo->
Size();
8378 return TClinginfo->
Tagnum();
8394 TTHREAD_TLS_DECL(std::string,
output);
8404 return TClinginfo->
Name();
8412 return TClinginfo->
Title();
8449 ClassInfo_t* base)
const
8462 return TClinginfo->
Next();
8470 return TClinginfo->
Next(onlyDirect);
8478 return TClinginfo->
Offset(address, isDerivedObject);
8491 return TClinginfo->
GetBaseOffset(TClinginfoBase, address, isDerivedObject);
8507 return (ClassInfo_t *)TClinginfo->
GetBase();
8515 return TClinginfo->
Tagnum();
8523 TTHREAD_TLS_DECL(std::string,
output);
8533 return TClinginfo->
Name();
8578 const clang::Decl* decl =
reinterpret_cast<const clang::Decl*
>(declid);
8579 const clang::ValueDecl* vd = llvm::dyn_cast_or_null<clang::ValueDecl>(decl);
8612 return TClinginfo->
Next();
8620 return TClinginfo->
Offset();
8668 return TClinginfo->
Name();
8676 return TClinginfo->
Title();
8683 TTHREAD_TLS_DECL(std::string,result);
8687 return result.c_str();
8694 Decl* decl =
static_cast<Decl*
>(
const_cast<void*
>(declId));
8695 ASTContext &C = decl->getASTContext();
8696 SourceRange commentRange;
8697 decl->addAttr(
new (C) AnnotateAttr( commentRange, C, attribute, 0 ) );
8708 cling::Interpreter &interp,
8711 const clang::TypeDecl* td = llvm::dyn_cast<clang::TypeDecl>(decl->getDeclContext());
8714 clang::QualType qualType(td->getTypeForDecl(),0);
8716 unsigned int level = 0;
8717 for(
size_t cursor =
name.length()-1; cursor != 0; --cursor) {
8718 if (
name[cursor] ==
'>') ++level;
8719 else if (
name[cursor] ==
'<' && level) --level;
8720 else if (level == 0 &&
name[cursor] ==
':') {
8721 name.erase(0,cursor+1);
8733 const auto *FD = llvm::dyn_cast<clang::FunctionDecl>(decl);
8734 if (
const auto *USD = llvm::dyn_cast<clang::UsingShadowDecl>(decl)) {
8735 FD = llvm::dyn_cast<clang::FunctionDecl>(USD->getTargetDecl());
8738 Error(
"GetFunctionName",
"NULL Decl!");
8745 if (llvm::isa<clang::CXXConstructorDecl>(FD))
8749 }
else if (llvm::isa<clang::CXXDestructorDecl>(decl))
8754 llvm::raw_string_ostream stream(
output);
8755 auto printPolicy = decl->getASTContext().getPrintingPolicy();
8757 printPolicy.AnonymousTagLocations =
false;
8758 FD->getNameForDiagnostic(stream, printPolicy,
false);
8788 return (FuncTempInfo_t*)
const_cast<void*
>(declid);
8799 return (FuncTempInfo_t*)ft_info;
8819 if (!ft_info)
return 0;
8820 const clang::FunctionTemplateDecl *ft = (
const clang::FunctionTemplateDecl*)ft_info;
8821 return ft->getTemplateParameters()->size();
8830 if (!ft_info)
return 0;
8831 const clang::FunctionTemplateDecl *ft = (clang::FunctionTemplateDecl*)ft_info;
8832 return ft->getTemplateParameters()->getMinRequiredArguments();
8840 if (!ft_info)
return 0;
8845 const clang::FunctionTemplateDecl *ft = (clang::FunctionTemplateDecl*)ft_info;
8847 switch (ft->getAccess()) {
8848 case clang::AS_public:
8851 case clang::AS_protected:
8854 case clang::AS_private:
8857 case clang::AS_none:
8858 if (ft->getDeclContext()->isNamespace())
8866 const clang::FunctionDecl *fd = ft->getTemplatedDecl();
8867 if (
const clang::CXXMethodDecl *md =
8868 llvm::dyn_cast<clang::CXXMethodDecl>(fd)) {
8869 if (md->getMethodQualifiers().hasConst()) {
8872 if (md->isVirtual()) {
8878 if (
const clang::CXXConstructorDecl *cd =
8879 llvm::dyn_cast<clang::CXXConstructorDecl>(md)) {
8880 if (cd->isExplicit()) {
8884 else if (
const clang::CXXConversionDecl *cd =
8885 llvm::dyn_cast<clang::CXXConversionDecl>(md)) {
8886 if (cd->isExplicit()) {
8900 if (!ft_info)
return 0;
8905 const clang::FunctionTemplateDecl *ft = (clang::FunctionTemplateDecl*)ft_info;
8906 const clang::FunctionDecl *fd = ft->getTemplatedDecl();
8908 if (fd->isOverloadedOperator())
8910 if (llvm::isa<clang::CXXConversionDecl>(fd))
8912 if (llvm::isa<clang::CXXConstructorDecl>(fd))
8914 if (llvm::isa<clang::CXXDestructorDecl>(fd))
8916 if (fd->isInlined())
8927 if (!ft_info)
return;
8928 const clang::FunctionTemplateDecl *ft = (clang::FunctionTemplateDecl*)ft_info;
8940 if (!ft_info)
return;
8941 const clang::FunctionTemplateDecl *ft = (
const clang::FunctionTemplateDecl*)ft_info;
8945 if (
const RedeclarableTemplateDecl *AnnotFD
8947 if (AnnotateAttr *A = AnnotFD->getAttr<AnnotateAttr>()) {
8948 output = A->getAnnotation().str();
8952 if (!ft->isFromASTFile()) {
9002 const clang::Decl* decl =
reinterpret_cast<const clang::Decl*
>(declid);
9035 return info->
NArg();
9051 return info->
Next();
9075 return (TypeInfo_t*)info->
Type();
9083 TTHREAD_TLS_DECL(
TString, mangled_name);
9085 return mangled_name;
9101 return info->
Name();
9128 return info->
Title();
9136 return MethodInfo_MethodCallReturnType(func->fInfo);
9138 return EReturnType::kOther;
9147 if (info && info->
IsValid()) {
9149 clang::QualType QT( typeinfo->
GetQualType().getCanonicalType() );
9150 if (QT->isEnumeralType()) {
9151 return EReturnType::kLong;
9152 }
else if (QT->isPointerType()) {
9154 QT = llvm::cast<clang::PointerType>(QT)->getPointeeType();
9155 if ( QT->isCharType() ) {
9156 return EReturnType::kString;
9158 return EReturnType::kOther;
9160 }
else if ( QT->isFloatingType() ) {
9161 int sz = typeinfo->
Size();
9162 if (sz == 4 || sz == 8) {
9164 return EReturnType::kDouble;
9166 return EReturnType::kOther;
9168 }
else if ( QT->isIntegerType() ) {
9169 int sz = typeinfo->
Size();
9178 return EReturnType::kLong;
9180 return EReturnType::kOther;
9183 return EReturnType::kOther;
9186 return EReturnType::kOther;
9222 return (MethodArgInfo_t*)
9239 return info->
Next();
9263 return info->
Name();
9339 return TClinginfo->
Name();
9363 return TClinginfo->
Size();
9413 const char*
name)
const
9433 return TClinginfo->
Next();
9449 return TClinginfo->
Size();
9465 return TClinginfo->
Name();
9473 return TClinginfo->
Title();
9482 Error(
"SnapshotMutexState",
"fRecurseCount != 0 even though initial mutex state is unset!");
9498 Error(
"ForgetMutexState",
"mutex state's recurse count already 0!");
9514 std::unique_ptr<MutexStateAndRecurseCountDelta> uniqueP{typedDelta};
9528 Error(
"ApplyToInterpreterMutex",
9529 "After returning from user code that turned on thread safety support, we notice that fInitialMutex is already used ... "
9530 "so the rest of this function/stack execution might have race condition (with the other thread that thinks it has exclusive access to the interpreter state.");
9546 return uniqueP.release();
The file contains utilities which are foundational and could be used across the core component of ROO...
unsigned long long ULong64_t
TClass *(* DictFuncPtr_t)()
R__EXTERN TApplication * gApplication
R__EXTERN TClassTable * gClassTable
static bool IsFromRootCling()
static void indent(ostringstream &buf, int indent_level)
The file contains facilities to work with C++ module files extensions used to store rdict files.
void TCling__RestoreInterpreterMutex(void *delta)
Re-apply the lock count delta that TCling__ResetInterpreterMutex() caused.
void * llvmLazyFunctionCreator(const std::string &mangled_name)
Autoload a library provided the mangled name of a missing symbol.
void TCling__TransactionRollback(const cling::Transaction &T)
static void RegisterPreIncludedHeaders(cling::Interpreter &clingInterp)
static bool hasParsedRootmapForLibrary(llvm::StringRef lib)
static std::string GetClassSharedLibsForModule(const char *cls, cling::LookupHelper &LH)
void TCling__InvalidateGlobal(const clang::Decl *D)
bool TClingLookupHelper__AutoParse(const char *cname)
Allow calling autoparsing from TMetaUtils.
void * TCling__LockCompilationDuringUserCodeExecution()
Lock the interpreter.
void TCling__UpdateListsOnUnloaded(const cling::Transaction &T)
void TCling__GetNormalizedContext(const ROOT::TMetaUtils::TNormalizedCtxt *&normCtxt)
R__DLLEXPORT clang::DeclContext * TCling__DEBUG__getDeclContext(clang::Decl *D)
ETupleOrdering
Check in what order the member of a tuple are layout.
bool TCling__LibraryLoadingFailed(const std::string &errmessage, const std::string &libStem, bool permanent, bool resolved)
Lookup libraries in LD_LIBRARY_PATH and DYLD_LIBRARY_PATH with mangled_name, which is extracted by er...
static const std::unordered_set< std::string > gIgnoredPCMNames
List of dicts that have the PCM information already in the PCH.
static Bool_t s_IsLibraryLoaded(const char *libname, cling::Interpreter *fInterpreter)
static std::string AlternateTuple(const char *classname, const cling::LookupHelper &lh)
R__DLLEXPORT void TCling__DEBUG__printName(clang::Decl *D)
R__DLLEXPORT void TCling__DEBUG__decl_dump(void *D)
static GlobalModuleIndex * loadGlobalModuleIndex(cling::Interpreter &interp)
bool TClingLookupHelper__ExistingTypeCheck(const std::string &tname, std::string &result)
Try hard to avoid looking up in the Cling database as this could enduce an unwanted autoparsing.
static bool HasASTFileOnDisk(clang::Module *M, const clang::Preprocessor &PP, std::string *FullFileName=nullptr)
Checks if there is an ASTFile on disk for the given module M.
R__DLLEXPORT clang::NamespaceDecl * TCling__DEBUG__DCtoNamespace(clang::DeclContext *DC)
void TCling__UnlockCompilationDuringUserCodeExecution(void *)
Unlock the interpreter.
const char * TCling__GetClassSharedLibs(const char *className)
R__DLLEXPORT clang::RecordDecl * TCling__DEBUG__DCtoRecordDecl(clang::DeclContext *DC)
static bool R__InitStreamerInfoFactory()
Helper to initialize TVirtualStreamerInfo's factor early.
int TCling__AutoParseCallback(const char *className)
int TCling_GenerateDictionary(const std::vector< std::string > &classes, const std::vector< std::string > &headers, const std::vector< std::string > &fwdDecls, const std::vector< std::string > &unknown)
R__DLLEXPORT bool TCling__TEST_isInvalidDecl(clang::Decl *D)
static bool HaveFullGlobalModuleIndex
R__DLLEXPORT void DestroyInterpreter(TInterpreter *interp)
void TCling__LibraryUnloadedRTTI(const void *dyLibHandle, const char *canonicalName)
void TCling__UpdateListsOnCommitted(const cling::Transaction &T, cling::Interpreter *)
const Decl * TCling__GetObjectDecl(TObject *obj)
static ETupleOrdering IsTupleAscending()
R__DLLEXPORT TInterpreter * CreateInterpreter(void *interpLibHandle, const char *argv[])
void TCling__RegisterRdictForLoadPCM(const std::string &pcmFileNameFullPath, llvm::StringRef *pcmContent)
R__DLLEXPORT void TCling__DEBUG__dump(clang::DeclContext *DC)
static void TCling__UpdateClassInfo(const NamedDecl *TD)
Update TClingClassInfo for a class (e.g. upon seeing a definition).
int TCling__CompileMacro(const char *fileName, const char *options)
void * TCling__ResetInterpreterMutex()
Reset the interpreter lock to the state it had before interpreter-related calls happened.
static void * LazyFunctionCreatorAutoloadForModule(const std::string &mangled_name, const cling::DynamicLibraryManager &DLM)
int TCling__AutoLoadCallback(const char *className)
static bool LoadModule(const std::string &ModuleName, cling::Interpreter &interp)
static void RegisterCxxModules(cling::Interpreter &clingInterp)
static void ConstructorName(std::string &name, const clang::Decl *decl, cling::Interpreter &interp, const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt)
void TCling__PrintStackTrace()
Print a StackTrace!
static int HandleInterpreterException(cling::MetaProcessor *metaProcessor, const char *input_line, cling::Interpreter::CompilationResult &compRes, cling::Value *result)
Let cling process a command line.
static std::string GetSharedLibImmediateDepsSlow(std::string lib, cling::Interpreter *interp, bool skipLoadedLibs=true)
This interface returns a list of dependent libraries in the form: lib libA.so libB....
static clang::ClassTemplateDecl * FindTemplateInNamespace(clang::Decl *decl)
Find a template decl within N nested namespaces, 0<=N<inf Assumes 1 and only 1 template present and 1...
static void PrintDlError(const char *dyLibName, const char *modulename)
void TCling__LibraryLoadedRTTI(const void *dyLibHandle, const char *canonicalName)
static cling::Interpreter::CompilationResult ExecAutoParse(const char *what, Bool_t header, cling::Interpreter *interpreter)
Parse the payload or header.
static bool requiresRootMap(const char *rootmapfile)
TObject * TCling__GetObjectAddress(const char *Name, void *&LookupCtx)
static void LoadModules(const std::vector< std::string > &modules, cling::Interpreter &interp)
Loads the C++ modules that we require to run any ROOT program.
int TCling__IsAutoLoadNamespaceCandidate(const clang::NamespaceDecl *nsDecl)
static bool hasPrecomputedLibraryDeps(llvm::StringRef lib)
void TCling__SplitAclicMode(const char *fileName, string &mode, string &args, string &io, string &fname)
void Info(const char *location, const char *msgfmt,...)
Use this function for informational messages.
void Error(const char *location, const char *msgfmt,...)
Use this function in case an error occurred.
R__EXTERN Int_t gErrorIgnoreLevel
void Warning(const char *location, const char *msgfmt,...)
Use this function in warning situations.
void Fatal(const char *location, const char *msgfmt,...)
Use this function in case of a fatal error. It will abort the program.
R__EXTERN TVirtualMutex * gInterpreterMutex
#define R__LOCKGUARD_CLING(mutex)
R__EXTERN TInterpreter * gCling
char * Form(const char *fmt,...)
typedef void((*Func_t)())
Bool_t R_ISREG(Int_t mode)
R__EXTERN TSystem * gSystem
R__EXTERN TVirtualMutex * gGlobalMutex
#define R__LOCKGUARD(mutex)
#define R__WRITE_LOCKGUARD(mutex)
#define R__READ_LOCKGUARD(mutex)
virtual std::unique_ptr< StateDelta > Rewind(const State &earlierState)=0
virtual void Apply(std::unique_ptr< StateDelta > &&delta)=0
virtual std::unique_ptr< State > GetStateBefore()=0
static Long_t ExecuteFile(const char *file, Int_t *error=0, Bool_t keep=kFALSE)
Execute a file containing a C++ macro (static method).
virtual TApplicationImp * GetApplicationImp()
virtual Bool_t IsCmdThread()
Each class (see TClass) has a linked list of its base class(es).
TClassRef is used to implement a permanent reference to a TClass object.
static DictFuncPtr_t GetDict(const char *cname)
Given the class name returns the Dictionary() function of a class (uses hash of name).
static TProtoClass * GetProtoNorm(const char *cname)
Given the class normalized name returns the TClassProto object for the class.
static DictFuncPtr_t GetDictNorm(const char *cname)
Given the normalized class name returns the Dictionary() function of a class (uses hash of name).
static TProtoClass * GetProto(const char *cname)
Given the class name returns the TClassProto object for the class.
static Bool_t Check(const char *cname, std::string &normname)
static void Add(const char *cname, Version_t id, const std::type_info &info, DictFuncPtr_t dict, Int_t pragmabits)
Add a class to the class table (this is a static function).
TClass instances represent classes, structs and namespaces in the ROOT type system.
TDataMember * GetDataMember(const char *datamember) const
Return pointer to datamember object with name "datamember".
ROOT::ESTLType GetCollectionType() const
Return the 'type' of the STL the TClass is representing.
EState fState
cached of the streaming method to use
std::atomic< TList * > fBase
static void AddClassToDeclIdMap(TDictionary::DeclId_t id, TClass *cl)
static: Add a TClass* to the map of classes.
TList * GetListOfFunctionTemplates(Bool_t load=kTRUE)
Return TListOfFunctionTemplates for a class.
void * DynamicCast(const TClass *base, void *obj, Bool_t up=kTRUE)
Cast obj of this class type up to baseclass cl if up is true.
static void RemoveClassDeclId(TDictionary::DeclId_t id)
Bool_t CallShowMembers(const void *obj, TMemberInspector &insp, Bool_t isTransient=kFALSE) const
Call ShowMembers() on the obj of this class type, passing insp and parent.
std::atomic< TListOfEnums * > fEnums
static Bool_t HasNoInfoOrEmuOrFwdDeclaredDecl(const char *)
virtual void PostLoadCheck()
Do the initialization that can only be done after the CINT dictionary has been fully populated and ca...
static TClass * LoadClass(const char *requestedname, Bool_t silent)
Helper function used by TClass::GetClass().
Int_t Size() const
Return size of object of this class.
TObjArray * fStreamerInfo
Bool_t IsLoaded() const
Return true if the shared library of this class is currently in the a process's memory.
ClassInfo_t * GetClassInfo() const
Long_t Property() const
Returns the properties of the TClass as a bit field stored as a Long_t value.
TVirtualCollectionProxy * GetCollectionProxy() const
Return the proxy describing the collection (if any).
void ResetCaches()
To clean out all caches.
static Int_t ReadRules()
Read the class.rules files from the default location:.
Version_t GetClassVersion() const
std::atomic< Bool_t > fHasRootPcmInfo
C++ Property of the class (is abstract, has virtual table, etc.)
const char * GetDeclFileName() const
Return name of the file containing the declaration of this class.
static TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE)
Static method returning pointer to TClass of the specified class name.
Emulation of the CINT BaseClassInfo class.
const char * TmpltName() const
const char * Name() const
ptrdiff_t Offset(void *address=0, bool isDerivedObject=true) const
void FullName(std::string &output, const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
TClingClassInfo * GetBase() const
Emulation of the CINT CallFunc class.
void ExecWithReturn(void *address, void *ret=nullptr)
long ExecInt(void *address)
void SetArgs(const char *args)
double ExecDouble(void *address)
void SetFunc(const TClingClassInfo *info, const char *method, const char *arglist, long *poffset)
TInterpreter::CallFuncIFacePtr_t IFacePtr()
void ExecWithArgsAndReturn(void *address, const void *args[]=0, int nargs=0, void *ret=0)
void SetArgArray(long *argArr, int narg)
void Exec(void *address, TInterpreterValue *interpVal=0)
TClingMethodInfo * FactoryMethod() const
int get_wrapper_code(std::string &wrapper_name, std::string &wrapper)
void IgnoreExtraArgs(bool ignore)
long long ExecInt64(void *address)
bool IsAutoLoadingEnabled()
void SetAutoParsingSuspended(bool val=true)
void SetAutoLoadingEnabled(bool val=true)
Emulation of the CINT ClassInfo class.
static bool IsEnum(cling::Interpreter *interp, const char *name)
long ClassProperty() const
void Init(const char *name)
void FullName(std::string &output, const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
EDataType GetUnderlyingType() const
TClingMethodInfo GetMethodWithArgs(const char *fname, const char *arglist, long *poffset, ROOT::EFunctionMatchMode mode=ROOT::kConversionMatch, EInheritanceMode imode=kWithInheritance) const
const char * TmpltName() const
const clang::Type * GetType() const
ptrdiff_t GetBaseOffset(TClingClassInfo *toBase, void *address, bool isDerivedObject)
bool IsScopedEnum() const
ROOT::TMetaUtils::EIOCtorCategory HasDefaultConstructor(bool checkio=false, std::string *type_name=nullptr) const
const clang::FunctionTemplateDecl * GetFunctionTemplate(const char *fname) const
int GetMethodNArg(const char *method, const char *proto, Bool_t objectIsConst, ROOT::EFunctionMatchMode mode=ROOT::kConversionMatch) const
bool HasMethod(const char *name) const
TDictionary::DeclId_t GetDeclId() const
void DeleteArray(void *arena, bool dtorOnly, const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
void * New(const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
bool IsValidMethod(const char *method, const char *proto, Bool_t objectIsConst, long *offset, ROOT::EFunctionMatchMode mode=ROOT::kConversionMatch) const
TClingMethodInfo GetMethod(const char *fname) const
const clang::ValueDecl * GetDataMember(const char *name) const
void Destruct(void *arena, const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
std::vector< std::string > GetUsingNamespaces()
bool IsBase(const char *name) const
void Delete(void *arena, const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
Emulation of the CINT DataMemberInfo class.
const char * TypeName() const
const char * TypeTrueName(const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
int MaxIndex(int dim) const
llvm::StringRef ValidArrayIndex() const
const char * Name() const override
long TypeProperty() const
virtual const char * Name() const
virtual bool IsValid() const
virtual const clang::Decl * GetDecl() const
Uses clang::TextDiagnosticPrinter to format diagnostics, which are then passed to a user-specified fu...
Emulation of the CINT MethodInfo class.
bool IsValid() const override
const char * DefaultValue() const
const TClingTypeInfo * Type() const
const char * TypeName() const
Emulation of the CINT MethodInfo class.
std::string GetMangledName() const
const char * TypeName() const
const char * Name() const override
void * InterfaceMethod(const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
const clang::FunctionDecl * GetTargetFunctionDecl() const
Get the FunctionDecl, or if this represents a UsingShadowDecl, the underlying target FunctionDecl.
const char * GetPrototype()
long ExtraProperty() const
void CreateSignature(TString &signature) const
TDictionary::DeclId_t GetDeclId() const
TClingTypeInfo * Type() const
Emulation of the CINT TypeInfo class.
std::string NormalizedName(const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
Return the normalized name of the type (i.e.
const char * Name() const override
bool IsValid() const override
clang::QualType GetQualType() const
void Init(const char *name)
const char * TrueName(const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
Return the normalized name of the type (i.e.
Emulation of the CINT TypedefInfo class.
const char * TrueName(const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
Get the name of the underlying type of the current typedef.
long Property() const
Return a bit mask of metadata about the current typedef.
const char * Name() const override
Get the name of the current typedef.
void Init(const char *name)
Lookup named typedef and reset the iterator to point to it.
int Next()
Increment the iterator.
int Size() const
Return the size in bytes of the underlying type of the current typedef.
Bridge between cling::Value and ROOT.
bool Append(const std::string &str)
Append string to the storage if not added already.
This class defines an interface to the cling C++ interpreter.
virtual const char * MethodArgInfo_DefaultValue(MethodArgInfo_t *marginfo) const
static Int_t DeepAutoLoadImpl(const char *cls, std::unordered_set< std::string > &visited, bool nameIsNormalized)
virtual std::string CallFunc_GetWrapperCode(CallFunc_t *func) const
virtual void FuncTempInfo_Name(FuncTempInfo_t *, TString &name) const
Return the name of this function template.
virtual void FuncTempInfo_Title(FuncTempInfo_t *, TString &name) const
Return the comments associates with this function template.
virtual int TypedefInfo_Next(TypedefInfo_t *tinfo) const
virtual bool DiagnoseIfInterpreterException(const std::exception &e) const
virtual bool ClassInfo_IsValid(ClassInfo_t *info) const
virtual bool ClassInfo_IsScopedEnum(ClassInfo_t *info) const
Long_t Calc(const char *line, EErrorCode *error=0)
Directly execute an executable statement (e.g.
Bool_t HasPCMForLibrary(const char *libname) const
Return true if ROOT has cxxmodules pcm for a given library name.
virtual MethodInfo_t * MethodInfo_FactoryCopy(MethodInfo_t *minfo) const
virtual const char * TypeInfo_Name(TypeInfo_t *) const
DeclId_t GetFunction(ClassInfo_t *cl, const char *funcname)
Return pointer to cling interface function for a method of a class with a certain name.
bool LibraryLoadingFailed(const std::string &, const std::string &, bool, bool)
virtual bool ClassInfo_HasMethod(ClassInfo_t *info, const char *name) const
std::vector< void * > fRegisterModuleDyLibs
virtual MethodInfo_t * CallFunc_FactoryMethod(CallFunc_t *func) const
virtual bool MethodInfo_IsValid(MethodInfo_t *minfo) const
std::vector< std::string > fAutoLoadLibStorage
virtual const char * DataMemberInfo_TypeTrueName(DataMemberInfo_t *dminfo) const
void CreateListOfDataMembers(TClass *cl) const
Create list of pointers to data members for TClass cl.
void UnRegisterTClassUpdate(const TClass *oldcl)
If the dictionary is loaded, we can remove the class from the list (otherwise the class might be load...
void HandleNewDecl(const void *DV, bool isDeserialized, std::set< TClass * > &modifiedClasses)
void InvalidateCachedDecl(const std::tuple< TListOfDataMembers *, TListOfFunctions *, TListOfFunctionTemplates *, TListOfEnums * > &Lists, const clang::Decl *D)
Invalidate cached TCling information for the given declaration, and removed it from the appropriate o...
virtual const char * MethodInfo_TypeName(MethodInfo_t *minfo) const
bool RegisterPrebuiltModulePath(const std::string &FullPath, const std::string &ModuleMapName="module.modulemap") const
virtual Long_t TypedefInfo_Property(TypedefInfo_t *tinfo) const
virtual void MethodArgInfo_Delete(MethodArgInfo_t *marginfo) const
virtual void LoadFunctionTemplates(TClass *cl) const
Create list of pointers to function templates for TClass cl.
virtual CallFunc_t * CallFunc_Factory() const
virtual TypedefInfo_t * TypedefInfo_FactoryCopy(TypedefInfo_t *tinfo) const
std::vector< const char * > fCurExecutingMacros
void UpdateListsOnCommitted(const cling::Transaction &T)
virtual void SetAllocunlockfunc(void(*)()) const
[Place holder for Mutex Unlock] Provide the interpreter with a way to release a lock used to protect ...
virtual Long_t ClassInfo_Tagnum(ClassInfo_t *info) const
void UpdateListOfTypes()
No op: see TClingCallbacks (used to update the list of types)
const char * GetSharedLibDeps(const char *lib, bool tryDyld=false)
Get the list a libraries on which the specified lib depends.
virtual DeclId_t GetDataMemberAtAddr(const void *addr) const
Return pointer to cling DeclId for a data member with a given name.
virtual int DataMemberInfo_ArrayDim(DataMemberInfo_t *dminfo) const
virtual bool ClassInfo_IsBase(ClassInfo_t *info, const char *name) const
virtual int BaseClassInfo_Next(BaseClassInfo_t *bcinfo) const
virtual void GenericError(const char *error) const
Let the interpreter issue a generic error, and set its error state.
virtual std::string MethodArgInfo_TypeNormalizedName(MethodArgInfo_t *marginfo) const
virtual const char * ClassInfo_TmpltName(ClassInfo_t *info) const
virtual TEnum * CreateEnum(void *VD, TClass *cl) const
virtual EReturnType MethodCallReturnType(TFunction *func) const
virtual int UnloadFile(const char *path) const
virtual int Evaluate(const char *, TInterpreterValue &)
Get the interpreter value corresponding to the statement.
TObject * GetObjectAddress(const char *Name, void *&LookupCtx)
If the interpreter encounters Name, check whether that is an object ROOT could retrieve.
virtual Long_t TypeInfo_Property(TypeInfo_t *tinfo) const
DeclId_t GetFunctionWithPrototype(ClassInfo_t *cl, const char *method, const char *proto, Bool_t objectIsConst=kFALSE, ROOT::EFunctionMatchMode mode=ROOT::kConversionMatch)
Return pointer to cling interface function for a method of a class with a certain prototype,...
bool IsClassAutoLoadingEnabled() const
Returns if class AutoLoading is currently enabled.
void InvalidateGlobal(const clang::Decl *D)
Invalidate cached TCling information for the given global declaration.
void EndOfLineAction()
It calls a "fantom" method to synchronize user keyboard input and ROOT prompt line.
DeclId_t GetFunctionWithValues(ClassInfo_t *cl, const char *method, const char *params, Bool_t objectIsConst=kFALSE)
Return pointer to cling DeclId for a method of a class with a certain prototype, i....
void UpdateListOfLoadedSharedLibraries()
void RegisterModule(const char *modulename, const char **headers, const char **includePaths, const char *payloadCode, const char *fwdDeclsCode, void(*triggerFunc)(), const FwdDeclArgsToKeepCollection_t &fwdDeclsArgToSkip, const char **classesHeaders, Bool_t lateRegistration=false, Bool_t hasCxxModule=false)
Inject the module named "modulename" into cling; load all headers.
virtual const char * DataMemberInfo_ValidArrayIndex(DataMemberInfo_t *dminfo) const
void InitRootmapFile(const char *name)
Create a resource table and read the (possibly) three resource files, i.e. $ROOTSYS/etc/system<name> ...
void CreateListOfMethodArgs(TFunction *m) const
Create list of pointers to method arguments for TMethod m.
virtual void TypedefInfo_Init(TypedefInfo_t *tinfo, const char *name) const
virtual Long_t MethodInfo_ExtraProperty(MethodInfo_t *minfo) const
virtual void ReportDiagnosticsToErrorHandler(bool enable=true)
Report diagnostics to the ROOT error handler (see TError.h).
void LoadPCM(std::string pcmFileNameFullPath)
Tries to load a rdict PCM, issues diagnostics if it fails.
virtual ~TCling()
Destroy the interpreter interface.
void AddFriendToClass(clang::FunctionDecl *, clang::CXXRecordDecl *) const
Inject function as a friend into klass.
Bool_t fCxxModulesEnabled
void RefreshClassInfo(TClass *cl, const clang::NamedDecl *def, bool alias)
Internal function. Actually do the update of the ClassInfo when seeing.
void ExecuteWithArgsAndReturn(TMethod *method, void *address, const void *args[]=0, int nargs=0, void *ret=0) const
virtual void FuncTempInfo_Delete(FuncTempInfo_t *) const
Delete the FuncTempInfo_t.
Bool_t SetSuspendAutoParsing(Bool_t value)
Suspend the Autoparsing of headers.
virtual DataMemberInfo_t * DataMemberInfo_FactoryCopy(DataMemberInfo_t *dminfo) const
virtual CallFuncIFacePtr_t CallFunc_IFacePtr(CallFunc_t *func) const
virtual void CallFunc_ExecWithReturn(CallFunc_t *func, void *address, void *ret) const
virtual MethodArgInfo_t * MethodArgInfo_Factory() const
virtual void DataMemberInfo_Delete(DataMemberInfo_t *dminfo) const
void ApplyToInterpreterMutex(void *delta)
Re-apply the lock count delta that TCling__ResetInterpreterMutex() caused.
void * LazyFunctionCreatorAutoload(const std::string &mangled_name)
Autoload a library based on a missing symbol.
virtual int LoadFile(const char *path) const
Load a source file or library called path into the interpreter.
void CodeComplete(const std::string &, size_t &, std::vector< std::string > &)
The call to Cling's tab complition.
virtual Long_t FuncTempInfo_Property(FuncTempInfo_t *) const
Return the property of the function template.
virtual TypeInfo_t * MethodInfo_Type(MethodInfo_t *minfo) const
virtual const char * MethodArgInfo_TypeName(MethodArgInfo_t *marginfo) const
Bool_t HandleNewTransaction(const cling::Transaction &T)
Helper function to increase the internal Cling count of transactions that change the AST.
virtual bool ClassInfo_HasDefaultConstructor(ClassInfo_t *info, Bool_t testio=kFALSE) const
virtual bool DataMemberInfo_IsValid(DataMemberInfo_t *dminfo) const
int ReadRootmapFile(const char *rootmapfile, TUniqueString *uniqueString=nullptr)
Read and parse a rootmapfile in its new format, and return 0 in case of success, -1 if the file has a...
Bool_t IsLoaded(const char *filename) const
Return true if the file has already been loaded by cint.
const char * GetSharedLibs()
Return the list of shared libraries loaded into the process.
virtual const char * GetTopLevelMacroName() const
Return the file name of the current un-included interpreted file.
std::map< SpecialObjectLookupCtx_t, SpecialObjectMap_t > fSpecialObjectMaps
virtual DeclId_t GetDataMemberWithValue(const void *ptrvalue) const
NOT IMPLEMENTED.
virtual bool MethodArgInfo_IsValid(MethodArgInfo_t *marginfo) const
Int_t ReloadAllSharedLibraryMaps()
Reload the library map entries coming from all the loaded shared libraries, after first unloading the...
virtual void SetErrmsgcallback(void *p) const
Set a callback to receive error messages.
virtual std::string ToString(const char *type, void *obj)
virtual const char * MethodInfo_Title(MethodInfo_t *minfo) const
virtual Long_t ClassInfo_GetBaseOffset(ClassInfo_t *fromDerived, ClassInfo_t *toBase, void *address, bool isDerivedObject) const
virtual int DataMemberInfo_TypeSize(DataMemberInfo_t *dminfo) const
virtual ClassInfo_t * ClassInfo_Factory(Bool_t all=kTRUE) const
virtual const char * MethodInfo_GetMangledName(MethodInfo_t *minfo) const
virtual bool CallFunc_IsValid(CallFunc_t *func) const
virtual const char * BaseClassInfo_TmpltName(BaseClassInfo_t *bcinfo) const
virtual void SetAlloclockfunc(void(*)()) const
[Place holder for Mutex Lock] Provide the interpreter with a way to acquire a lock used to protect cr...
virtual void MethodInfo_CreateSignature(MethodInfo_t *minfo, TString &signature) const
void SnapshotMutexState(ROOT::TVirtualRWMutex *mtx)
virtual Bool_t ClassInfo_Contains(ClassInfo_t *info, DeclId_t declid) const
Return true if the entity pointed to by 'declid' is declared in the context described by 'info'.
std::set< size_t > fPayloads
virtual const char * ClassInfo_Name(ClassInfo_t *info) const
Int_t UnloadLibraryMap(const char *library)
Unload library map entries coming from the specified library.
virtual ClassInfo_t * BaseClassInfo_ClassInfo(BaseClassInfo_t *) const
TObjArray * fRootmapFiles
virtual void CallFunc_Delete(CallFunc_t *func) const
virtual Long_t ClassInfo_ClassProperty(ClassInfo_t *info) const
cling::Interpreter * GetInterpreterImpl() const
virtual bool ClassInfo_IsLoaded(ClassInfo_t *info) const
std::vector< std::pair< TClass *, DictFuncPtr_t > > fClassesToUpdate
virtual int ClassInfo_GetMethodNArg(ClassInfo_t *info, const char *method, const char *proto, Bool_t objectIsConst=false, ROOT::EFunctionMatchMode mode=ROOT::kConversionMatch) const
Int_t DeleteGlobal(void *obj)
Delete obj from Cling symbol table so it cannot be accessed anymore.
virtual const char * GetCurrentMacroName() const
Return the file name of the currently interpreted file, included or not.
virtual void TypeInfo_Delete(TypeInfo_t *tinfo) const
virtual Bool_t LoadText(const char *text) const
Load the declarations from text into the interpreter.
void GetInterpreterTypeName(const char *name, std::string &output, Bool_t full=kFALSE)
The 'name' is known to the interpreter, this function returns the internal version of this name (usua...
void * RewindInterpreterMutex()
Reset the interpreter lock to the state it had before interpreter-related calls happened.
virtual Long_t BaseClassInfo_Offset(BaseClassInfo_t *toBaseClassInfo, void *address, bool isDerivedObject) const
virtual int GetSecurityError() const
Interface to cling function.
virtual UInt_t FuncTempInfo_TemplateMinReqArgs(FuncTempInfo_t *) const
Return the number of required template arguments of the function template described by ft_info.
void ResetGlobals()
Reset in Cling the list of global variables to the state saved by the last call to TCling::SaveGlobal...
virtual const char * ClassInfo_Title(ClassInfo_t *info) const
virtual void AddAvailableIndentifiers(TSeqCollection &Idents)
virtual Long_t BaseClassInfo_Property(BaseClassInfo_t *bcinfo) const
virtual FuncTempInfo_t * FuncTempInfo_Factory(DeclId_t declid) const
Construct a FuncTempInfo_t.
void * GetInterfaceMethod(TClass *cl, const char *method, const char *params, Bool_t objectIsConst=kFALSE)
Return pointer to cling interface function for a method of a class with parameters params (params is ...
virtual void ClassInfo_Destruct(ClassInfo_t *info, void *arena) const
virtual const char * BaseClassInfo_FullName(BaseClassInfo_t *bcinfo) const
virtual bool ClassInfo_IsEnum(const char *name) const
virtual DataMemberInfo_t * DataMemberInfo_Factory(ClassInfo_t *clinfo, TDictionary::EMemberSelection selection) const
Long_t ProcessLine(const char *line, EErrorCode *error=0)
virtual void TypedefInfo_Delete(TypedefInfo_t *tinfo) const
void SetGetline(const char *(*getlineFunc)(const char *prompt), void(*histaddFunc)(const char *line))
Set a getline function to call when input is needed.
void RewindDictionary()
Rewind Cling dictionary to the point where it was before executing the current macro.
std::map< std::string, llvm::StringRef > fPendingRdicts
virtual const char * MapCppName(const char *) const
Interface to cling function.
static void UpdateClassInfoWork(const char *name)
virtual Long_t FuncTempInfo_ExtraProperty(FuncTempInfo_t *) const
Return the property not already defined in Property See TDictionary's EFunctionProperty.
void PrintIntro()
No-op; see TRint instead.
virtual CallFunc_t * CallFunc_FactoryCopy(CallFunc_t *func) const
virtual const char * DataMemberInfo_Name(DataMemberInfo_t *dminfo) const
Bool_t Declare(const char *code)
Declare code to the interpreter, without any of the interpreter actions that could trigger a re-inter...
Int_t DeleteVariable(const char *name)
Undeclare obj called name.
virtual int ClassInfo_Next(ClassInfo_t *info) const
static void * fgSetOfSpecials
void AddIncludePath(const char *path)
Add a directory to the list of directories in which the interpreter looks for include files.
virtual void CallFunc_SetArgArray(CallFunc_t *func, Long_t *paramArr, Int_t nparam) const
virtual const char * MethodInfo_Name(MethodInfo_t *minfo) const
void ClearFileBusy()
Reset the interpreter internal state in case a previous action was not correctly terminated.
virtual const char * MethodArgInfo_Name(MethodArgInfo_t *marginfo) const
virtual Long_t ClassInfo_Property(ClassInfo_t *info) const
ROOT::TMetaUtils::TNormalizedCtxt * fNormalizedCtxt
virtual int MethodInfo_Next(MethodInfo_t *minfo) const
const char * TypeName(const char *typeDesc)
Return the absolute type of typeDesc.
void SaveContext()
Save the current Cling state.
std::set< TClass * > & GetModTClasses()
virtual bool TypeInfo_IsValid(TypeInfo_t *tinfo) const
Int_t AutoLoad(const char *classname, Bool_t knowDictNotLoaded=kFALSE)
Load library containing the specified class.
TClingCallbacks * fClingCallbacks
TString GetMangledNameWithPrototype(TClass *cl, const char *method, const char *proto, Bool_t objectIsConst=kFALSE, ROOT::EFunctionMatchMode mode=ROOT::kConversionMatch)
Return the cling mangled name for a method of a class with a certain prototype, i....
void RegisterTClassUpdate(TClass *oldcl, DictFuncPtr_t dict)
Register classes that already existed prior to their dictionary loading and that already had a ClassI...
virtual Long_t DataMemberInfo_Property(DataMemberInfo_t *dminfo) const
void UpdateListOfGlobalFunctions()
No op: see TClingCallbacks (used to update the list of global functions)
virtual const char * MethodInfo_GetPrototype(MethodInfo_t *minfo) const
virtual bool ClassInfo_IsValidMethod(ClassInfo_t *info, const char *method, const char *proto, Long_t *offset, ROOT::EFunctionMatchMode=ROOT::kConversionMatch) const
virtual void * ClassInfo_New(ClassInfo_t *info) const
virtual void TypeInfo_Init(TypeInfo_t *tinfo, const char *funcname) const
Bool_t SetErrorMessages(Bool_t enable=kTRUE)
If error messages are disabled, the interpreter should suppress its failures and warning messages fro...
virtual const char * DataMemberInfo_Title(DataMemberInfo_t *dminfo) const
void TransactionRollback(const cling::Transaction &T)
virtual EDataType ClassInfo_GetUnderlyingType(ClassInfo_t *info) const
virtual void CallFunc_Init(CallFunc_t *func) const
virtual UInt_t FuncTempInfo_TemplateNargs(FuncTempInfo_t *) const
Return the maximum number of template arguments of the function template described by ft_info.
TString GetMangledName(TClass *cl, const char *method, const char *params, Bool_t objectIsConst=kFALSE)
Return the cling mangled name for a method of a class with parameters params (params is a string of a...
virtual void SetTempLevel(int val) const
Create / close a scope for temporaries.
virtual DeclId_t GetDataMember(ClassInfo_t *cl, const char *name) const
Return pointer to cling Decl of global/static variable that is located at the address given by addr.
void RegisterTemporary(const TInterpreterValue &value)
MutexStateAndRecurseCount fInitialMutex
virtual void LoadEnums(TListOfEnums &cl) const
Create list of pointers to enums for TClass cl.
virtual void CallFunc_SetArg(CallFunc_t *func, Long_t param) const
virtual Long_t GetExecByteCode() const
This routines used to return the address of the internal wrapper function (of the interpreter) that w...
virtual void * MethodInfo_InterfaceMethod(MethodInfo_t *minfo) const
Int_t UnloadAllSharedLibraryMaps()
Unload the library map entries coming from all the loaded shared libraries.
virtual void CallFunc_IgnoreExtraArgs(CallFunc_t *func, bool ignore) const
std::vector< cling::Value > * fTemporaries
virtual Long_t MethodInfo_Property(MethodInfo_t *minfo) const
virtual std::unique_ptr< TInterpreterValue > MakeInterpreterValue() const
virtual Long_t DataMemberInfo_Offset(DataMemberInfo_t *dminfo) const
static Int_t ShallowAutoLoadImpl(const char *cls)
void LibraryLoaded(const void *dyLibHandle, const char *canonicalName)
virtual TypedefInfo_t * TypedefInfo_Factory() const
void UpdateListOfGlobals()
No op: see TClingCallbacks (used to update the list of globals)
void ClearStack()
Delete existing temporary values.
std::map< const cling::Transaction *, size_t > fTransactionHeadersMap
virtual int SetClassAutoparsing(int)
Enable/Disable the Autoparsing of headers.
Bool_t fHeaderParsingOnDemand
virtual int SetClassAutoLoading(int) const
Enable/Disable the AutoLoading of libraries.
Int_t RescanLibraryMap()
Scan again along the dynamic path for library maps.
virtual int DataMemberInfo_Next(DataMemberInfo_t *dminfo) const
void Reset()
Pressing Ctrl+C should forward here.
Int_t Load(const char *filenam, Bool_t system=kFALSE)
Load a library file in cling's memory.
void InspectMembers(TMemberInspector &, const void *obj, const TClass *cl, Bool_t isTransient)
Visit all members over members, recursing over base classes.
std::hash< std::string > fStringHashFunction
const char * GetIncludePath()
Refresh the list of include paths known to the interpreter and return it with -I prepended.
static void RemoveAndInvalidateObject(List &L, Object *O)
virtual void ClassInfo_DeleteArray(ClassInfo_t *info, void *arena, bool dtorOnly) const
virtual void GetFunctionName(const clang::Decl *decl, std::string &name) const
Long_t ExecuteMacro(const char *filename, EErrorCode *error=0)
Execute a cling macro.
virtual DeclId_t GetEnum(TClass *cl, const char *name) const
Return pointer to cling Decl of global/static variable that is located at the address given by addr.
void GetFunctionOverloads(ClassInfo_t *cl, const char *funcname, std::vector< DeclId_t > &res) const
Insert overloads of name in cl to res.
virtual void CallFunc_Exec(CallFunc_t *func, void *address) const
virtual int DisplayIncludePath(FILE *fout) const
Interface to cling function.
void RegisterLoadedSharedLibrary(const char *name)
Register a new shared library name with the interpreter; add it to fSharedLibs.
virtual void UpdateEnumConstants(TEnum *enumObj, TClass *cl) const
void SaveGlobalsContext()
Save the current Cling state of global objects.
std::unordered_set< const clang::NamespaceDecl * > fNSFromRootmaps
void ProcessClassesToUpdate()
virtual Long_t MethodArgInfo_Property(MethodArgInfo_t *marginfo) const
virtual const char * GetSTLIncludePath() const
Return the directory containing CINT's stl cintdlls.
Int_t LoadLibraryMap(const char *rootmapfile=0)
Load map between class and library.
virtual std::string MethodInfo_TypeNormalizedName(MethodInfo_t *minfo) const
void Execute(const char *function, const char *params, int *error=0)
Execute a global function with arguments params.
virtual const char * ClassInfo_FullName(ClassInfo_t *info) const
TClass * GenerateTClass(const char *classname, Bool_t emulation, Bool_t silent=kFALSE)
Generate a TClass for the given class.
virtual int TypeInfo_Size(TypeInfo_t *tinfo) const
virtual int MethodArgInfo_Next(MethodArgInfo_t *marginfo) const
ROOT::TMetaUtils::TClingLookupHelper * fLookupHelper
virtual const char * TypedefInfo_TrueName(TypedefInfo_t *tinfo) const
Bool_t fIsAutoParsingSuspended
TClass * GetClass(const std::type_info &typeinfo, Bool_t load) const
Demangle the name (from the typeinfo) and then request the class via the usual name based interface (...
DeclId_t GetDeclId(const llvm::GlobalValue *gv) const
Return pointer to cling DeclId for a global value.
Long_t ProcessLineAsynch(const char *line, EErrorCode *error=0)
Let cling process a command line asynch.
virtual std::vector< std::string > GetUsingNamespaces(ClassInfo_t *cl) const
Get the scopes representing using declarations of namespace.
Int_t SetClassSharedLibs(const char *cls, const char *libs)
Register the AutoLoading information for a class.
virtual void ClassInfo_Init(ClassInfo_t *info, const char *funcname) const
virtual TypeInfo_t * TypeInfo_FactoryCopy(TypeInfo_t *) const
Bool_t CheckClassTemplate(const char *name)
Return true if there is a class template by the given name ...
void LoadPCMImpl(TFile &pcmFile)
Tries to load a PCM from TFile; returns true on success.
Bool_t IsAutoLoadNamespaceCandidate(const clang::NamespaceDecl *nsDecl)
TObjArray * GetRootMapFiles() const
void * fPrevLoadedDynLibInfo
void UpdateListOfDataMembers(TClass *cl) const
Update the list of pointers to data members for TClass cl This is now a nop.
virtual void SetDeclAttr(DeclId_t, const char *)
virtual Long_t DataMemberInfo_TypeProperty(DataMemberInfo_t *dminfo) const
virtual const char * DataMemberInfo_TypeName(DataMemberInfo_t *dminfo) const
virtual void CallFunc_SetArgs(CallFunc_t *func, const char *param) const
virtual const char * BaseClassInfo_Name(BaseClassInfo_t *bcinfo) const
virtual void MethodInfo_Delete(MethodInfo_t *minfo) const
Interface to cling function.
virtual const char * TypeInfo_TrueName(TypeInfo_t *tinfo) const
std::set< const char * > fParsedPayloadsAddresses
ECheckClassInfo CheckClassInfo(const char *name, Bool_t autoload, Bool_t isClassOrNamespaceOnly=kFALSE)
Checks if an entity with the specified name is defined in Cling.
static void UpdateClassInfo(char *name, Long_t tagnum)
No op: see TClingCallbacks.
virtual void BaseClassInfo_Delete(BaseClassInfo_t *bcinfo) const
void ResetGlobalVar(void *obj)
Reset the Cling 'user' global objects/variables state to the state saved by the last call to TCling::...
std::unique_ptr< cling::Interpreter > fInterpreter
Bool_t IsLibraryLoaded(const char *libname) const
virtual void Initialize()
Initialize the interpreter, once TROOT::fInterpreter is set.
virtual void * FindSym(const char *entry) const
Interface to cling function.
virtual Long_t CallFunc_ExecInt(CallFunc_t *func, void *address) const
virtual int DataMemberInfo_MaxIndex(DataMemberInfo_t *dminfo, Int_t dim) const
void SetClassInfo(TClass *cl, Bool_t reload=kFALSE)
Set pointer to the TClingClassInfo in TClass.
Long_t ProcessLineSynch(const char *line, EErrorCode *error=0)
Let cling process a command line synchronously, i.e we are waiting it will be finished.
virtual int TypeInfo_RefType(TypeInfo_t *) const
cling::MetaProcessor * GetMetaProcessorImpl() const
void LoadMacro(const char *filename, EErrorCode *error=0)
Load a macro file in cling's memory.
std::set< size_t > fLookedUpClasses
virtual void CallFunc_ResetArg(CallFunc_t *func) const
virtual Long64_t CallFunc_ExecInt64(CallFunc_t *func, void *address) const
virtual Long_t BaseClassInfo_Tagnum(BaseClassInfo_t *bcinfo) const
void ResetAll()
Reset the Cling state to its initial state.
virtual void ClassInfo_Delete(ClassInfo_t *info) const
virtual Double_t CallFunc_ExecDouble(CallFunc_t *func, void *address) const
UInt_t AutoParseImplRecurse(const char *cls, bool topLevel)
Helper routine for TCling::AutoParse implementing the actual call to the parser and looping over temp...
virtual const char * TypedefInfo_Title(TypedefInfo_t *tinfo) const
void CreateListOfBaseClasses(TClass *cl) const
Create list of pointers to base class(es) for TClass cl.
void RecursiveRemove(TObject *obj)
Delete object from cling symbol table so it can not be used anymore.
virtual MethodArgInfo_t * MethodArgInfo_FactoryCopy(MethodArgInfo_t *marginfo) const
void UpdateListsOnUnloaded(const cling::Transaction &T)
Invalidate stored TCling state for declarations included in transaction ‘T’.
void UpdateClassInfoWithDecl(const clang::NamedDecl *ND)
Internal function. Inform a TClass about its new TagDecl or NamespaceDecl.
virtual const char * ClassInfo_FileName(ClassInfo_t *info) const
virtual void CallFunc_ExecWithArgsAndReturn(CallFunc_t *func, void *address, const void *args[]=0, int nargs=0, void *ret=0) const
DeclId_t GetFunctionTemplate(ClassInfo_t *cl, const char *funcname)
Return pointer to cling interface function for a method of a class with a certain name.
virtual int MethodInfo_NArg(MethodInfo_t *minfo) const
virtual FuncTempInfo_t * FuncTempInfo_FactoryCopy(FuncTempInfo_t *) const
Construct a FuncTempInfo_t.
virtual int TypedefInfo_Size(TypedefInfo_t *tinfo) const
std::unique_ptr< cling::MetaProcessor > fMetaProcessor
virtual const char * TypedefInfo_Name(TypedefInfo_t *tinfo) const
virtual void CallFunc_SetFuncProto(CallFunc_t *func, ClassInfo_t *info, const char *method, const char *proto, Long_t *Offset, ROOT::EFunctionMatchMode mode=ROOT::kConversionMatch) const
Interface to cling function.
virtual int DisplayClass(FILE *fout, const char *name, int base, int start) const
const char * GetClassSharedLibs(const char *cls)
Get the list of shared libraries containing the code for class cls.
Bool_t IsErrorMessagesEnabled() const
If error messages are disabled, the interpreter should suppress its failures and warning messages fro...
ULong64_t fTransactionCount
virtual Bool_t FuncTempInfo_IsValid(FuncTempInfo_t *) const
Check validity of a FuncTempInfo_t.
virtual BaseClassInfo_t * BaseClassInfo_Factory(ClassInfo_t *info) const
virtual bool TypedefInfo_IsValid(TypedefInfo_t *tinfo) const
virtual MethodInfo_t * MethodInfo_Factory() const
Int_t AutoParse(const char *cls)
Parse the headers relative to the class Returns 1 in case of success, 0 in case of failure.
virtual EReturnType MethodInfo_MethodCallReturnType(MethodInfo_t *minfo) const
void * GetInterfaceMethodWithPrototype(TClass *cl, const char *method, const char *proto, Bool_t objectIsConst=kFALSE, ROOT::EFunctionMatchMode mode=ROOT::kConversionMatch)
Return pointer to cling interface function for a method of a class with a certain prototype,...
virtual TypeInfo_t * TypeInfo_Factory() const
std::map< size_t, std::vector< const char * > > fClassesHeadersMap
virtual int MethodInfo_NDefaultArg(MethodInfo_t *minfo) const
Int_t GenerateDictionary(const char *classes, const char *includes="", const char *options=0)
Generate the dictionary for the C++ classes listed in the first argument (in a semi-colon separated l...
virtual void CallFunc_SetFunc(CallFunc_t *func, ClassInfo_t *info, const char *method, const char *params, Long_t *Offset) const
void CreateListOfMethods(TClass *cl) const
Create list of pointers to methods for TClass cl.
void UpdateListOfMethods(TClass *cl) const
Update the list of pointers to method for TClass cl This is now a nop.
void RegisterRdictForLoadPCM(const std::string &pcmFileNameFullPath, llvm::StringRef *pcmContent)
Register Rdict data for future loading by LoadPCM;.
virtual int ClassInfo_Size(ClassInfo_t *info) const
static void UpdateAllCanvases()
Update all canvases at end the terminal input command.
void LibraryUnloaded(const void *dyLibHandle, const char *canonicalName)
Collection abstract base class.
virtual TObject * FindObject(const char *name) const
Find an object in this collection using its name.
virtual Int_t GetEntries() const
virtual void SetOwner(Bool_t enable=kTRUE)
Set whether this collection is the owner (enable==true) of its content.
virtual void Add(TObject *obj)=0
Bool_t Contains(const char *name) const
All ROOT classes may have RTTI (run time type identification) support added.
Bool_t IsPersistent() const
Basic data type descriptor (datatype information is obtained from CINT).
EMemberSelection
Kinds of members to include in lists.
TList * GetListOfKeys() const override
Small helper to keep current directory context.
void GetObject(const char *namecycle, T *&ptr)
Get an object with proper type checking.
The TEnumConstant class implements the constants of the enum type.
The TEnum class implements the enum type.
const TSeqCollection * GetConstants() const
static TEnum * GetEnum(const std::type_info &ti, ESearchAction sa=kALoadAndInterpLookup)
DeclId_t GetDeclId() const
const char * GetValue() const
const char * GetName() const
Returns name of object.
The TEnv class reads config files, by default named .rootrc.
THashList * GetTable() const
Bool_t IgnoreDuplicates(Bool_t ignore)
If set to true, no warnings in case of duplicates are issued.
virtual void SetRcName(const char *name)
virtual Int_t ReadFile(const char *fname, EEnvLevel level)
Read and parse the resource file for a certain level.
virtual void SetValue(const char *name, const char *value, EEnvLevel level=kEnvChange, const char *type=nullptr)
Set the value of a resource or create a new resource.
virtual TEnvRec * Lookup(const char *n) const
Loop over all resource records and return the one with name.
A ROOT file is a suite of consecutive data records (TKey instances) with a well defined format.
Global functions class (global functions are obtained from CINT).
Global variables class (global variables are obtained from CINT).
THashList implements a hybrid collection class consisting of a hash table and a list to store TObject...
TObject * Remove(TObject *obj)
Remove object from the list.
THashTable implements a hash table to store TObject's.
virtual const void * GetValAddr() const =0
This class defines an abstract interface to a generic command line interpreter.
virtual bool RegisterPrebuiltModulePath(const std::string &FullPath, const std::string &ModuleMapName="module.modulemap") const =0
virtual Bool_t HasPCMForLibrary(const char *libname) const =0
virtual Int_t AutoParse(const char *cls)=0
int(* AutoLoadCallBack_t)(const char *)
virtual const char * GetClassSharedLibs(const char *cls)=0
virtual Bool_t Declare(const char *code)=0
std::vector< std::pair< std::string, int > > FwdDeclArgsToKeepCollection_t
TDictionary::DeclId_t DeclId_t
virtual TObjArray * GetRootMapFiles() const =0
Book space in a file, create I/O buffers, to fill them, (un)compress them.
A collection of TDataMember objects designed for fast access given a DeclId_t and for keep track of T...
TDictionary * Find(DeclId_t id) const
Return (after creating it if necessary) the TDataMember describing the data member corresponding to t...
TClass * GetClass() const
virtual TObject * FindObject(const char *name) const
Specialize FindObject to do search for the a data member just by name or create it if its not already...
A collection of TEnum objects designed for fast access given a DeclId_t and for keep track of TEnum t...
A collection of TEnum objects designed for fast access given a DeclId_t and for keep track of TEnum t...
TEnum * Find(DeclId_t id) const
Return the TEnum corresponding to the Decl 'id' or NULL if it does not exist.
TEnum * Get(DeclId_t id, const char *name)
Return (after creating it if necessary) the TEnum describing the enum corresponding to the Decl 'id'.
TClass * GetClass() const
A collection of TFunction objects designed for fast access given a DeclId_t and for keep track of TFu...
TFunctionTemplate * Get(DeclId_t id)
Return (after creating it if necessary) the TMethod or TFunction describing the function correspondin...
A collection of TFunction objects designed for fast access given a DeclId_t and for keep track of TFu...
TFunction * Find(DeclId_t id) const
Return the TMethod or TFunction describing the function corresponding to the Decl 'id'.
virtual void Add(TObject *obj)
virtual TObject * At(Int_t idx) const
Returns the object at position idx. Returns 0 if idx is out of range.
A TMemFile is like a normal TFile except that it reads and writes only from memory.
Abstract base class for accessing the data-members of a class.
const char * GetParent() const
virtual void Inspect(TClass *cl, const char *parent, const char *name, const void *addr)
EObjectPointerState GetObjectValidity() const
virtual Bool_t IsTreatingNonAccessibleTypes()
void SetObjectValidity(EObjectPointerState val)
void InspectMember(const T &obj, const char *name, Bool_t isTransient)
Each ROOT method (see TMethod) has a linked list of its arguments.
const char * GetFullTypeName() const
Get full type description of method argument, e.g.: "class TDirectory*".
const char * GetDefault() const
Get default value of method argument.
Each ROOT class (see TClass) has a linked list of methods.
virtual TList * GetListOfMethodArgs()
Returns methodarg list and additionally updates fDataMember in TMethod by calling FindDataMember();.
The TNamed class is the base class for all named ROOT classes.
virtual const char * GetName() const
Returns name of object.
Int_t GetEntriesFast() const
virtual void Expand(Int_t newSize)
Expand or shrink the array to newSize elements.
virtual void Compress()
Remove empty slots from array.
Int_t GetEntries() const
Return the number of objects in array (i.e.
virtual void Clear(Option_t *option="")
Remove all objects from the array.
virtual TObject * FindObject(const char *name) const
Find an object in this collection using its name.
virtual TObject * Remove(TObject *obj)
Remove object from array.
TObject * At(Int_t idx) const
Collectable string class.
Mother of all ROOT objects.
virtual void Clear(Option_t *="")
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
R__ALWAYS_INLINE Bool_t IsOnHeap() const
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
virtual TObject * FindObject(const char *name) const
Must be redefined in derived classes.
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
virtual void Fatal(const char *method, const char *msgfmt,...) const
Issue fatal error message.
virtual const char * GetTitle() const
Returns title of object.
@ kInvalidObject
if object ctor succeeded but object should not be used
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
Persistent version of a TClass.
static const TString & GetBinDir()
Get the binary directory in the installation. Static utility function.
static const TString & GetIncludeDir()
Get the include directory in the installation. Static utility function.
static const char * GetMacroPath()
Get macro search path. Static utility function.
static const std::vector< std::string > & AddExtraInterpreterArgs(const std::vector< std::string > &args)
Provide command line arguments to the interpreter construction.
static const TString & GetEtcDir()
Get the sysconfig directory in the installation. Static utility function.
static const char **& GetExtraInterpreterArgs()
INTERNAL function! Used by rootcling to inject interpreter arguments through a C-interface layer.
static const TString & GetLibDir()
Get the library directory in the installation. Static utility function.
Sequenceable collection abstract base class.
virtual void Add(TObject *obj)
Describe Streamer information for one class version.
Bool_t EndsWith(const char *pat, ECaseCompare cmp=kExact) const
Return true if string ends with the specified string.
const char * Data() const
TString & ReplaceAll(const TString &s1, const TString &s2)
Ssiz_t Last(char c) const
Find last occurrence of a character c.
TObjArray * Tokenize(const TString &delim) const
This function is used to isolate sequential tokens in a TString.
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
TString & Prepend(const char *cs)
TString & Remove(Ssiz_t pos)
TString & Append(const char *cs)
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
virtual Bool_t ExpandPathName(TString &path)
Expand a pathname getting rid of special shell characters like ~.
virtual void FreeDirectory(void *dirp)
Free a directory.
virtual void * OpenDirectory(const char *name)
Open a directory. Returns 0 if directory does not exist.
virtual const char * Getenv(const char *env)
Get environment variable.
virtual const char * GetIncludePath()
Get the list of include path.
virtual TString SplitAclicMode(const char *filename, TString &mode, TString &args, TString &io) const
This method split a filename of the form:
virtual char * ConcatFileName(const char *dir, const char *name)
Concatenate a directory and a file name. User must delete returned string.
virtual const char * FindFile(const char *search, TString &file, EAccessMode mode=kFileExists)
Find location of file in a search path.
virtual int Load(const char *module, const char *entry="", Bool_t system=kFALSE)
Load a shared library.
int GetPathInfo(const char *path, Long_t *id, Long_t *size, Long_t *flags, Long_t *modtime)
Get info about a file: id, size, flags, modification time.
virtual const char * PrependPathName(const char *dir, TString &name)
Concatenate a directory and a file name.
virtual Bool_t AccessPathName(const char *path, EAccessMode mode=kFileExists)
Returns FALSE if one can access a file using the specified access mode.
virtual const char * GetDirEntry(void *dirp)
Get a directory entry. Returns 0 if no more entries.
virtual int GetProcInfo(ProcInfo_t *info) const
Returns cpu and memory used by this process into the ProcInfo_t structure.
virtual const char * BaseName(const char *pathname)
Base name of a file name. Base name of /user/root is root.
virtual const char * GetDynamicPath()
Return the dynamic path (used to find shared libraries).
virtual const char * FindDynamicLibrary(TString &lib, Bool_t quiet=kFALSE)
Find a dynamic library using the system search paths.
virtual void Sleep(UInt_t milliSec)
Sleep milliSec milli seconds.
virtual int CompileMacro(const char *filename, Option_t *opt="", const char *library_name="", const char *build_dir="", UInt_t dirmode=0)
This method compiles and loads a shared library containing the code from the file "filename".
virtual const char * WorkingDirectory()
Return working directory.
virtual char * Which(const char *search, const char *file, EAccessMode mode=kFileExists)
Find location of file in a search path.
virtual void Setenv(const char *name, const char *value)
Set environment variable.
virtual const char * HomeDirectory(const char *userName=nullptr)
Return the user's home directory.
virtual TString GetDirName(const char *pathname)
Return the directory name in pathname.
virtual void StackTrace()
Print a stack trace.
char * DynamicPathName(const char *lib, Bool_t quiet=kFALSE)
Find a dynamic library called lib using the system search paths.
virtual TVirtualMutex * Factory(Bool_t=kFALSE)=0
TVirtualPad is an abstract base class for the Pad and Canvas classes.
static void SetFactory(TVirtualStreamerInfo *factory)
static function: Set the StreamerInfo factory
@ kNeedObjectForVirtualBaseClass
const std::string & GetPathSeparator()
const char & GetEnvPathSeparator()
bool CanConvertEnvValueToBool(const std::string &value)
bool ConvertEnvValueToBool(const std::string &value)
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...
R__EXTERN TVirtualRWMutex * gCoreMutex
bool IsStdPairBase(std::string_view name)
bool IsStdArray(std::string_view name)
bool IsStdClass(const char *type)
return true if the class belongs to the std namespace
bool IsStdPair(std::string_view name)
std::string InsertStd(const char *tname)
bool SplitFunction(std::string_view decl, FunctionSplitInfo &result)
Split a function declaration into its different parts.
std::string GetLong64_Name(const char *original)
Replace 'long long' and 'unsigned long long' by 'Long64_t' and 'ULong64_t'.
char * DemangleTypeIdName(const std::type_info &ti, int &errorCode)
Demangle in a portable way the type id name.
const char * GetUnqualifiedName(const char *name)
Return the start of the unqualified name include in 'original'.
void Init(TClassEdit::TInterpreterLookupHelper *helper)
ROOT::ESTLType IsSTLCont(std::string_view type)
type : type name: vector<list<classA,allocator>,allocator> result: 0 : not stl container code of cont...
char * DemangleName(const char *mangled_name, int &errorCode)
int GetSplit(const char *type, std::vector< std::string > &output, int &nestedLoc, EModType mode=TClassEdit::kNone)
Stores in output (after emptying it) the split type.
EComplexType GetComplexType(const char *)
RAII used to store Parser, Sema, Preprocessor state for recursive parsing.
Result of splitting a function declaration into fReturnType fScopeName::fFunctionName<fFunctionTempla...
std::string fScopeName
Name of the scope qualification of the function, possibly empty.
std::vector< std::string > fElements
void ShortType(std::string &answer, int mode)
Return the absolute type of typeDesc into the string answ.
std::unique_ptr< ROOT::TVirtualRWMutex::State > fState
State of gCoreMutex when the first interpreter-related function was invoked.
Int_t fRecurseCount
Interpreter-related functions will push the "entry" lock state to *this.
A read-only memory range which we do not control.
static void output(int code)