From 3aa83e5fd6e96db062da7f2db75316ae198bf110 Mon Sep 17 00:00:00 2001 From: Axel Naumann Date: Thu, 29 Apr 2021 15:20:43 +0200 Subject: [PATCH] [cling] Lifetime of MetaParser is that of its input: Before, MetaParser might have pointed to a StringRef whose storage was gone, see asan failure in roottest/cling/other/runfileClose.C below. This was caused by recursive uses of MetaParser; see stack trace below: the inner recursion returned, but as the same MetaParser object was used by both frames, the objects cursor now pointed to freed memory. Instead, create a MetaParser (and MetaLexer) object per input. That way, their lifetime corresponds to the lifetime of their input. ================================================================= ==529104==ERROR: AddressSanitizer: stack-use-after-return on address 0x7ffff3afd82a at pc 0x7fffea18df6d bp 0x7fffffff8170 sp 0x7fffffff8168 READ of size 1 at 0x7ffff3afd82a thread T0 [Detaching after fork from child process 529183] #0 0x7fffea18df6c in cling::MetaLexer::Lex(cling::Token&) src/interpreter/cling/lib/MetaProcessor/MetaLexer.cpp:58:11 #1 0x7fffea190d7c in cling::MetaParser::lookAhead(unsigned int) src/interpreter/cling/lib/MetaProcessor/MetaParser.cpp:89:15 #2 0x7fffea190bd5 in cling::MetaParser::consumeToken() src/interpreter/cling/lib/MetaProcessor/MetaParser.cpp:49:5 #3 0x7fffea191d4d in cling::MetaParser::isLCommand(cling::MetaSema::ActionResult&) src/interpreter/cling/lib/MetaProcessor/MetaParser.cpp:147:9 #4 0x7fffea1914dd in cling::MetaParser::isCommand(cling::MetaSema::ActionResult&, cling::Value*) src/interpreter/cling/lib/MetaProcessor/MetaParser.cpp:123:12 #5 0x7fffea191216 in cling::MetaParser::isMetaCommand(cling::MetaSema::ActionResult&, cling::Value*) src/interpreter/cling/lib/MetaProcessor/MetaParser.cpp:101:33 #6 0x7fffea14e5aa in cling::MetaProcessor::process(llvm::StringRef, cling::Interpreter::CompilationResult&, cling::Value*, bool) src/interpreter/cling/lib/MetaProcessor/MetaProcessor.cpp:317:24 #7 0x7fffe99b67b7 in HandleInterpreterException(cling::MetaProcessor*, char const*, cling::Interpreter::CompilationResult&, cling::Value*) src/core/metacling/src/TCling.cxx:2431:29 #8 0x7fffe99bde30 in TCling::Load(char const*, bool) src/core/metacling/src/TCling.cxx:3454:10 #9 0x7ffff7865f11 in TSystem::Load(char const*, char const*, bool) src/core/base/src/TSystem.cxx:1941:27 #10 0x7ffff7b8a0e3 in TUnixSystem::Load(char const*, char const*, bool) src/core/unix/src/TUnixSystem.cxx:2789:20 #11 0x7fffd78dd08b () #12 0x7fffe9f8a5d9 in cling::IncrementalExecutor::executeWrapper(llvm::StringRef, cling::Value*) const src/interpreter/cling/lib/Interpreter/IncrementalExecutor.cpp:376:3 #13 0x7fffe9d73dc2 in cling::Interpreter::RunFunction(clang::FunctionDecl const*, cling::Value*) src/interpreter/cling/lib/Interpreter/Interpreter.cpp:1141:20 #14 0x7fffe9d6e317 in cling::Interpreter::EvaluateInternal(std::__cxx11::basic_string, std::allocator > const&, cling::CompilationOptions, cling::Value*, cling::Transaction**, unsigned long) src/interpreter/cling/lib/Interpreter/Interpreter.cpp:1391:29 #15 0x7fffe9d6c1fe in cling::Interpreter::process(std::__cxx11::basic_string, std::allocator > const&, cling::Value*, cling::Transaction**, bool) src/interpreter/cling/lib/Interpreter/Interpreter.cpp:819:9 #16 0x7fffea151826 in cling::MetaProcessor::readInputFromFile(llvm::StringRef, cling::Value*, unsigned long, bool) src/interpreter/cling/lib/MetaProcessor/MetaProcessor.cpp:507:22 #17 0x7fffe99b585b in TCling::ProcessLine(char const*, TInterpreter::EErrorCode*) src/core/metacling/src/TCling.cxx:2570:39 #18 0x7fffe99bbfee in TCling::ProcessLineSynch(char const*, TInterpreter::EErrorCode*) src/core/metacling/src/TCling.cxx:3496:17 #19 0x7ffff77203d3 in TApplication::ExecuteFile(char const*, int*, bool) src/core/base/src/TApplication.cxx:1608:30 #20 0x7ffff771ebdf in TApplication::ProcessFile(char const*, int*, bool) src/core/base/src/TApplication.cxx:1480:11 #21 0x7ffff771e385 in TApplication::ProcessLine(char const*, bool, int*) src/core/base/src/TApplication.cxx:1453:14 #22 0x7ffff7f8157a in TRint::ProcessLineNr(char const*, char const*, int*) src/core/rint/src/TRint.cxx:766:11 #23 0x7ffff7f802f0 in TRint::Run(bool) src/core/rint/src/TRint.cxx:424:22 #24 0x4ff96d in main src/main/src/rmain.cxx:30:12 #25 0x7ffff6e040b2 in __libc_start_main /build/glibc-YbNSs7/glibc-2.31/csu/../csu/libc-start.c:308:16 #26 0x41f35d in _start (asan/bin/root.exe+0x41f35d) Address 0x7ffff3afd82a is located in stack of thread T0 at offset 42 in frame #0 0x7fffe99b3d8f in TCling::ProcessLine(char const*, TInterpreter::EErrorCode*) src/core/metacling/src/TCling.cxx:2456 This frame has 21 object(s): [32, 56) 'sLine' (line 2462) <== Memory access at offset 42 is inside this variable [96, 104) 'R__guard2471' (line 2471) [128, 136) 'R__guard2488' (line 2488) [160, 176) 'interpreterFlagsRAII' (line 2491) [192, 240) 'result' (line 2511) [272, 276) 'compRes' (line 2512) [288, 312) 'mod_line' (line 2517) [352, 376) 'aclicMode' (line 2518) [416, 440) 'arguments' (line 2519) [480, 504) 'io' (line 2520) [544, 568) 'fname' (line 2521) [608, 632) 'ref.tmp' (line 2547) [672, 696) 'ref.tmp145' (line 2547) [736, 768) 'code' (line 2555) [800, 832) 'codeline' (line 2556) [864, 1384) 'in' (line 2559) [1520, 1552) 'ref.tmp176' (line 2562) [1584, 1600) 'agg.tmp' [1616, 1624) 'ref.tmp198' (line 2568) [1648, 1664) 'agg.tmp207' [1680, 1696) 'autoParseRaii' (line 2588) HINT: this may be a false positive if your program uses some custom stack unwind mechanism, swapcontext or vfork (longjmp and C++ exceptions *are* supported) SUMMARY: AddressSanitizer: stack-use-after-return src/interpreter/cling/lib/MetaProcessor/MetaLexer.cpp:58:11 in cling::MetaLexer::Lex(cling::Token&) Shadow bytes around the buggy address: 0x10007e757ab0: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 0x10007e757ac0: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 0x10007e757ad0: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 0x10007e757ae0: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 0x10007e757af0: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 =>0x10007e757b00: f5 f5 f5 f5 f5[f5]f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 0x10007e757b10: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 0x10007e757b20: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 0x10007e757b30: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 0x10007e757b40: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 0x10007e757b50: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 Shadow byte legend (one shadow byte represents 8 application bytes): Addressable: 00 Partially addressable: 01 02 03 04 05 06 07 Heap left redzone: fa Freed heap region: fd Stack left redzone: f1 Stack mid redzone: f2 Stack right redzone: f3 Stack after return: f5 Stack use after scope: f8 Global redzone: f9 Global init order: f6 Poisoned by user: f7 Container overflow: fc Array cookie: ac Intra object redzone: bb ASan internal: fe Left alloca redzone: ca Right alloca redzone: cb Shadow gap: cc ==529104==ABORTING at src/interpreter/cling/lib/MetaProcessor/MetaLexer.cpp:49 at src/interpreter/cling/lib/MetaProcessor/MetaParser.cpp:41 compRes=@0x7ffff3afd910: cling::Interpreter::kSuccess, result=0x7ffff3afd8c0, disableValuePrinting=false) at src/interpreter/cling/lib/MetaProcessor/MetaProcessor.cpp:314 input_line=0x7ffff3afd829 "#define XYZ 21", compRes=@0x7ffff3afd910: cling::Interpreter::kSuccess, result=0x7ffff3afd8c0) at src/core/metacling/src/TCling.cxx:2431 error=0x7fffd78cb0f4 ) at src/core/metacling/src/TCling.cxx:2591 sync=false, err=0x7fffd78cb0f4 ) at src/core/base/src/TApplication.cxx:1472 line=0x7fffd78c9000 "#define XYZ 21", error=0x7fffd78cb0f4 ) at src/core/base/src/TROOT.cxx:2328 from asan/roottest/cling/other/fileClose_C.so filename=0x6070000f0fd0 "asan/roottest/cling/other/fileClose_C.so", flag=257) at /home/axel/build/llvm/llvm-project/compiler-rt/lib/asan/../sanitizer_common/sanitizer_common_interceptors.inc:6270 at src/interpreter/cling/lib/Utils/PlatformPosix.cpp:118 permanent=false, resolved=true) at src/interpreter/cling/lib/Interpreter/DynamicLibraryManager.cpp:184 at src/interpreter/cling/lib/Interpreter/Interpreter.cpp:1444 T=0x0) at src/interpreter/cling/lib/Interpreter/Interpreter.cpp:1560 at src/interpreter/cling/lib/MetaProcessor/MetaSema.cpp:57 actionResult=@0x7ffff39532b0: cling::MetaSema::AR_Success) --- .../include/cling/MetaProcessor/MetaParser.h | 7 +- .../cling/MetaProcessor/MetaProcessor.h | 4 +- .../cling/lib/MetaProcessor/MetaParser.cpp | 79 +++++++++---------- .../cling/lib/MetaProcessor/MetaProcessor.cpp | 10 +-- 4 files changed, 47 insertions(+), 53 deletions(-) diff --git a/interpreter/cling/include/cling/MetaProcessor/MetaParser.h b/interpreter/cling/include/cling/MetaProcessor/MetaParser.h index 63f181a63e14d..7591eb62ab3f3 100644 --- a/interpreter/cling/include/cling/MetaProcessor/MetaParser.h +++ b/interpreter/cling/include/cling/MetaProcessor/MetaParser.h @@ -65,7 +65,7 @@ namespace cling { class MetaParser { private: MetaLexer m_Lexer; - std::unique_ptr m_Actions; + MetaSema &m_Actions; llvm::SmallVector m_TokenCache; llvm::SmallVector m_MetaSymbolCache; private: @@ -113,8 +113,7 @@ namespace cling { bool isShellCommand(MetaSema::ActionResult& actionResult, Value* resultValue); public: - MetaParser(MetaSema* Actions); - void enterNewInputLine(llvm::StringRef Line); + MetaParser(MetaSema &Actions, llvm::StringRef Line); ///\brief Drives the recursive decendent parsing. /// @@ -127,7 +126,7 @@ namespace cling { /// bool isQuitRequested() const; - MetaSema& getActions() const { return *m_Actions.get(); } + MetaSema& getActions() const { return m_Actions; } }; } // end namespace cling diff --git a/interpreter/cling/include/cling/MetaProcessor/MetaProcessor.h b/interpreter/cling/include/cling/MetaProcessor/MetaProcessor.h index aa3716f8d8ac6..1469e5ed1dcb0 100644 --- a/interpreter/cling/include/cling/MetaProcessor/MetaProcessor.h +++ b/interpreter/cling/include/cling/MetaProcessor/MetaProcessor.h @@ -24,7 +24,7 @@ namespace cling { class Interpreter; class InputValidator; - class MetaParser; + class MetaSema; class Value; ///\brief Class that helps processing meta commands, which add extra @@ -43,7 +43,7 @@ namespace cling { ///\brief The parser used to parse our tiny "meta" language /// - std::unique_ptr m_MetaParser; + std::unique_ptr m_MetaSema; ///\brief Currently executing file as passed into executeFile /// diff --git a/interpreter/cling/lib/MetaProcessor/MetaParser.cpp b/interpreter/cling/lib/MetaProcessor/MetaParser.cpp index 61387fc8055a4..0d3ab3c74a733 100644 --- a/interpreter/cling/lib/MetaProcessor/MetaParser.cpp +++ b/interpreter/cling/lib/MetaProcessor/MetaParser.cpp @@ -24,9 +24,9 @@ namespace cling { - MetaParser::MetaParser(MetaSema* Actions) : m_Lexer("") { - m_Actions.reset(Actions); - const InvocationOptions& Opts = Actions->getInterpreter().getOptions(); + MetaParser::MetaParser(MetaSema &Actions, llvm::StringRef Line) : + m_Lexer(Line), m_Actions(Actions) { + const InvocationOptions& Opts = Actions.getInterpreter().getOptions(); MetaLexer metaSymbolLexer(Opts.MetaString); Token Tok; while(true) { @@ -37,11 +37,6 @@ namespace cling { } } - void MetaParser::enterNewInputLine(llvm::StringRef Line) { - m_Lexer.reset(Line); - m_TokenCache.clear(); - } - void MetaParser::consumeToken() { if (m_TokenCache.size()) m_TokenCache.erase(m_TokenCache.begin()); @@ -102,7 +97,7 @@ namespace cling { } bool MetaParser::isQuitRequested() const { - return m_Actions->isQuitRequested(); + return m_Actions.isQuitRequested(); } bool MetaParser::isCommandSymbol() { @@ -143,11 +138,11 @@ namespace cling { consumeAnyStringToken(tok::comment); if (getCurTok().is(tok::raw_ident)) { result = true; - actionResult = m_Actions->actOnLCommand(getCurTok().getIdent()); + actionResult = m_Actions.actOnLCommand(getCurTok().getIdent()); consumeToken(); if (getCurTok().is(tok::comment)) { consumeAnyStringToken(tok::eof); - m_Actions->actOnComment(getCurTok().getIdent()); + m_Actions.actOnComment(getCurTok().getIdent()); } } } @@ -168,7 +163,7 @@ namespace cling { if (getCurTok().is(tok::raw_ident)) { result = true; std::string outputFile = getCurTok().getIdent(); - actionResult = m_Actions->actOnTCommand(inputFile, outputFile); + actionResult = m_Actions.actOnTCommand(inputFile, outputFile); } } } @@ -257,9 +252,9 @@ namespace cling { } // Empty file means std. actionResult = - m_Actions->actOnRedirectCommand(file/*file*/, - stream/*which stream to redirect*/, - append/*append mode*/); + m_Actions.actOnRedirectCommand(file/*file*/, + stream/*which stream to redirect*/, + append/*append mode*/); return true; } return false; @@ -316,7 +311,7 @@ namespace cling { if (args.empty()) args = "()"; - actionResult = m_Actions->actOnxCommand(file, args, resultValue); + actionResult = m_Actions.actOnxCommand(file, args, resultValue); return true; } @@ -335,7 +330,7 @@ namespace cling { bool result = false; if (getCurTok().is(tok::ident) && getCurTok().getIdent().equals("q")) { result = true; - m_Actions->actOnqCommand(); + m_Actions.actOnqCommand(); } return result; } @@ -346,7 +341,7 @@ namespace cling { llvm::StringRef path; if (getCurTok().is(tok::raw_ident)) { path = getCurTok().getIdent(); - actionResult = m_Actions->actOnUCommand(path); + actionResult = m_Actions.actOnUCommand(path); return true; } } @@ -361,7 +356,7 @@ namespace cling { llvm::StringRef path; if (getCurTok().is(tok::raw_ident)) path = getCurTok().getIdent(); - m_Actions->actOnICommand(path); + m_Actions.actOnICommand(path); return true; } return false; @@ -378,7 +373,7 @@ namespace cling { consumeAnyStringToken(tok::eof); if (getCurTok().is(tok::raw_ident)) return false; - actionResult = m_Actions->actOnOCommand(level); + actionResult = m_Actions.actOnOCommand(level); return true; } } else { @@ -389,11 +384,11 @@ namespace cling { int level = 0; if (!lastStringToken.getIdent().getAsInteger(10, level) && level >= 0) { - actionResult = m_Actions->actOnOCommand(level); + actionResult = m_Actions.actOnOCommand(level); return true; } } else { - m_Actions->actOnOCommand(); + m_Actions.actOnOCommand(); actionResult = MetaSema::AR_Success; return true; } @@ -409,7 +404,7 @@ namespace cling { ) { consumeToken(); skipWhitespace(); - m_Actions->actOnAtCommand(); + m_Actions.actOnAtCommand(); return true; } return false; @@ -423,7 +418,7 @@ namespace cling { skipWhitespace(); if (getCurTok().is(tok::constant)) mode = (MetaSema::SwitchMode)getCurTok().getConstantAsBool(); - m_Actions->actOnrawInputCommand(mode); + m_Actions.actOnrawInputCommand(mode); return true; } return false; @@ -437,7 +432,7 @@ namespace cling { skipWhitespace(); if (getCurTok().is(tok::constant)) mode = getCurTok().getConstant(); - m_Actions->actOndebugCommand(mode); + m_Actions.actOndebugCommand(mode); return true; } return false; @@ -451,7 +446,7 @@ namespace cling { skipWhitespace(); if (getCurTok().is(tok::constant)) mode = (MetaSema::SwitchMode)getCurTok().getConstantAsBool(); - m_Actions->actOnprintDebugCommand(mode); + m_Actions.actOnprintDebugCommand(mode); return true; } return false; @@ -467,7 +462,7 @@ namespace cling { return false; // FIXME: Issue proper diagnostics std::string ident = getCurTok().getIdentNoQuotes(); consumeToken(); - m_Actions->actOnstoreStateCommand(ident); + m_Actions.actOnstoreStateCommand(ident); return true; } return false; @@ -483,7 +478,7 @@ namespace cling { return false; // FIXME: Issue proper diagnostics std::string ident = getCurTok().getIdentNoQuotes(); consumeToken(); - m_Actions->actOncompareStateCommand(ident); + m_Actions.actOncompareStateCommand(ident); return true; } return false; @@ -500,7 +495,7 @@ namespace cling { consumeToken(); skipWhitespace(); const Token& next = getCurTok(); - m_Actions->actOnstatsCommand(what, next.is(tok::ident) + m_Actions.actOnstatsCommand(what, next.is(tok::ident) ? next.getIdent() : llvm::StringRef()); return true; } @@ -518,7 +513,7 @@ namespace cling { llvm::StringRef ident = getCurTok().getIdent(); consumeToken(); skipWhitespace(); - m_Actions->actOnstatsCommand(ident.equals("ast") + m_Actions.actOnstatsCommand(ident.equals("ast") ? llvm::StringRef("asttree") : ident, getCurTok().is(tok::ident) ? getCurTok().getIdent() : llvm::StringRef()); consumeToken(); @@ -534,9 +529,9 @@ namespace cling { skipWhitespace(); const Token& next = getCurTok(); if (next.is(tok::constant)) - m_Actions->actOnUndoCommand(next.getConstant()); + m_Actions.actOnUndoCommand(next.getConstant()); else - m_Actions->actOnUndoCommand(); + m_Actions.actOnUndoCommand(); return true; } return false; @@ -550,7 +545,7 @@ namespace cling { skipWhitespace(); if (getCurTok().is(tok::constant)) mode = (MetaSema::SwitchMode)getCurTok().getConstantAsBool(); - m_Actions->actOndynamicExtensionsCommand(mode); + m_Actions.actOndynamicExtensionsCommand(mode); return true; } return false; @@ -560,7 +555,7 @@ namespace cling { const Token& Tok = getCurTok(); if (Tok.is(tok::quest_mark) || (Tok.is(tok::ident) && Tok.getIdent().equals("help"))) { - m_Actions->actOnhelpCommand(); + m_Actions.actOnhelpCommand(); return true; } return false; @@ -568,7 +563,7 @@ namespace cling { bool MetaParser::isfileExCommand() { if (getCurTok().is(tok::ident) && getCurTok().getIdent().equals("fileEx")) { - m_Actions->actOnfileExCommand(); + m_Actions.actOnfileExCommand(); return true; } return false; @@ -576,7 +571,7 @@ namespace cling { bool MetaParser::isfilesCommand() { if (getCurTok().is(tok::ident) && getCurTok().getIdent().equals("files")) { - m_Actions->actOnfilesCommand(); + m_Actions.actOnfilesCommand(); return true; } return false; @@ -591,11 +586,11 @@ namespace cling { llvm::StringRef className; if (NextTok.is(tok::raw_ident)) className = NextTok.getIdent(); - m_Actions->actOnclassCommand(className); + m_Actions.actOnclassCommand(className); return true; } else if (Tok.getIdent().equals("Class")) { - m_Actions->actOnClassCommand(); + m_Actions.actOnClassCommand(); return true; } } @@ -609,7 +604,7 @@ namespace cling { consumeAnyStringToken(tok::eof); if (getCurTok().is(tok::raw_ident)) return false; - m_Actions->actOnNamespaceCommand(); + m_Actions.actOnNamespaceCommand(); return true; } } @@ -623,7 +618,7 @@ namespace cling { llvm::StringRef varName; if (getCurTok().is(tok::ident)) varName = getCurTok().getIdent(); - m_Actions->actOngCommand(varName); + m_Actions.actOngCommand(varName); return true; } return false; @@ -638,7 +633,7 @@ namespace cling { llvm::StringRef typedefName; if (NextTok.is(tok::raw_ident)) typedefName = NextTok.getIdent(); - m_Actions->actOnTypedefCommand(typedefName); + m_Actions.actOnTypedefCommand(typedefName); return true; } } @@ -656,7 +651,7 @@ namespace cling { if (NextTok.is(tok::raw_ident)) { llvm::StringRef commandLine(NextTok.getIdent()); if (!commandLine.empty()) - actionResult = m_Actions->actOnShellCommand(commandLine, + actionResult = m_Actions.actOnShellCommand(commandLine, resultValue); } return true; diff --git a/interpreter/cling/lib/MetaProcessor/MetaProcessor.cpp b/interpreter/cling/lib/MetaProcessor/MetaProcessor.cpp index 4e14ff24ed36c..13bf73da9833b 100644 --- a/interpreter/cling/lib/MetaProcessor/MetaProcessor.cpp +++ b/interpreter/cling/lib/MetaProcessor/MetaProcessor.cpp @@ -286,7 +286,7 @@ namespace cling { MetaProcessor::MetaProcessor(Interpreter& interp, raw_ostream& outs) : m_Interp(interp), m_Outs(&outs) { m_InputValidator.reset(new InputValidator()); - m_MetaParser.reset(new MetaParser(new MetaSema(interp, *this))); + m_MetaSema.reset(new MetaSema(interp, *this)); } MetaProcessor::~MetaProcessor() { @@ -311,12 +311,12 @@ namespace cling { } // Check for and handle meta commands. - m_MetaParser->enterNewInputLine(input_line); + MetaParser parser(*m_MetaSema, input_line); MetaSema::ActionResult actionResult = MetaSema::AR_Success; if (!m_InputValidator->inBlockComment() && - m_MetaParser->isMetaCommand(actionResult, result)) { + parser.isMetaCommand(actionResult, result)) { - if (m_MetaParser->isQuitRequested()) + if (parser.isQuitRequested()) return -1; if (actionResult != MetaSema::AR_Success) @@ -525,7 +525,7 @@ namespace cling { void MetaProcessor::registerUnloadPoint(const Transaction* T, llvm::StringRef filename) { - m_MetaParser->getActions().registerUnloadPoint(T, filename); + m_MetaSema->registerUnloadPoint(T, filename); } } // end namespace cling