This is an archive of the discontinued LLVM Phabricator instance.

[clang-repl] Allow passing in code as positional arguments.
ClosedPublic

Authored by v.g.vassilev on Jun 24 2021, 11:22 PM.

Diff Detail

Event Timeline

v.g.vassilev requested review of this revision.Jun 24 2021, 11:22 PM
v.g.vassilev created this revision.
sgraenitz accepted this revision.Jun 30 2021, 8:48 AM

LGTM

clang/test/Interpreter/execute.cpp
1–2

Maybe this could move down to line 8, so it's closer to the code that it works with?

clang/tools/clang-repl/ClangRepl.cpp
89

OptInputs.empty() ?

This revision is now accepted and ready to land.Jun 30 2021, 8:48 AM
This revision was landed with ongoing or failed builds.Jul 1 2021, 12:57 PM
This revision was automatically updated to reflect the committed changes.
v.g.vassilev marked 2 inline comments as done.
Herald added a project: Restricted Project. · View Herald TranscriptJul 1 2021, 12:57 PM
v.g.vassilev added inline comments.Jul 1 2021, 12:57 PM
clang/tools/clang-repl/ClangRepl.cpp
89

Good point. Thanks!

hctim added a subscriber: hctim.Jul 2 2021, 11:07 AM

Hi, looks like this change caused a regression on the sanitizer buildbots (https://lab.llvm.org/buildbot/#/builders/169/builds/1290/steps/25/logs/stdio). Error copied below for your convenience.

Can be repro'd using the bot instructions at https://github.com/google/sanitizers/wiki/SanitizerBotReproduceBuild, or (should be possible) by using cmake -DLLVM_USE_SANITIZER=Address -GNinja && ninja check-clang.

******************** TEST 'Clang :: Interpreter/execute.cpp' FAILED ********************
Script:
--
: 'RUN: at line 1';   /b/sanitizer-x86_64-linux-fast/build/llvm_build_asan/bin/clang-repl "int i = 10;" 'extern "C" int printf(const char*,...);'             'auto r1 = printf("i = %d\n", i);' | /b/sanitizer-x86_64-linux-fast/build/llvm_build_asan/bin/FileCheck --check-prefix=CHECK-DRIVER /b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/test/Interpreter/execute.cpp
: 'RUN: at line 8';   cat /b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/test/Interpreter/execute.cpp | /b/sanitizer-x86_64-linux-fast/build/llvm_build_asan/bin/clang-repl | /b/sanitizer-x86_64-linux-fast/build/llvm_build_asan/bin/FileCheck /b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/test/Interpreter/execute.cpp
--
Exit Code: 1
Command Output (stderr):
--
=================================================================
==67042==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 3384 byte(s) in 3 object(s) allocated from:
    #0 0x44fbefd in operator new(unsigned long) /b/s/w/ir/cache/builder/src/third_party/llvm/compiler-rt/lib/asan/asan_new_delete.cpp:95:3
    #1 0x4bb65ad in llvm::RegisterTargetMachine<llvm::X86TargetMachine>::Allocator(llvm::Target const&, llvm::Triple const&, llvm::StringRef, llvm::StringRef, llvm::TargetOptions const&, llvm::Optional<llvm::Reloc::Model>, llvm::Optional<llvm::CodeModel::Model>, llvm::CodeGenOpt::Level, bool) /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/Support/TargetRegistry.h:1209:12
    #2 0x6acad7f in createTargetMachine /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/Support/TargetRegistry.h:429:12
    #3 0x6acad7f in (anonymous namespace)::EmitAssemblyHelper::CreateTargetMachine(bool) /b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/lib/CodeGen/BackendUtil.cpp:907:23
    #4 0x6ab5a43 in (anonymous namespace)::EmitAssemblyHelper::EmitAssemblyWithNewPassManager(clang::BackendAction, std::__1::unique_ptr<llvm::raw_pwrite_stream, std::__1::default_delete<llvm::raw_pwrite_stream> >) /b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/lib/CodeGen/BackendUtil.cpp:1195:3
    #5 0x6aac51b in clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::HeaderSearchOptions const&, clang::CodeGenOptions const&, clang::TargetOptions const&, clang::LangOptions const&, llvm::StringRef, llvm::Module*, clang::BackendAction, std::__1::unique_ptr<llvm::raw_pwrite_stream, std::__1::default_delete<llvm::raw_pwrite_stream> >) /b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/lib/CodeGen/BackendUtil.cpp:1654:15
    #6 0x6aa0610 in clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) /b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/lib/CodeGen/CodeGenAction.cpp:334:7
    #7 0x59ba3bf in clang::IncrementalParser::ParseOrWrapTopLevelDecl() /b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/lib/Interpreter/IncrementalParser.cpp:177:13
    #8 0x59bc084 in clang::IncrementalParser::Parse(llvm::StringRef) /b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/lib/Interpreter/IncrementalParser.cpp:227:27
    #9 0x585dd64 in clang::Interpreter::Parse(llvm::StringRef) /b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/lib/Interpreter/Interpreter.cpp:202:22
    #10 0x4501f45 in clang::Interpreter::ParseAndExecute(llvm::StringRef) /b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/include/clang/Interpreter/Interpreter.h:61:29
    #11 0x4500605 in main /b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/tools/clang-repl/ClangRepl.cpp:95:30
    #12 0x7f625d26909a in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2409a)

Hi, looks like this change caused a regression on the sanitizer buildbots (https://lab.llvm.org/buildbot/#/builders/169/builds/1290/steps/25/logs/stdio). Error copied below for your convenience.

Can be repro'd using the bot instructions at https://github.com/google/sanitizers/wiki/SanitizerBotReproduceBuild, or (should be possible) by using cmake -DLLVM_USE_SANITIZER=Address -GNinja && ninja check-clang.

******************** TEST 'Clang :: Interpreter/execute.cpp' FAILED ********************
Script:
--
: 'RUN: at line 1';   /b/sanitizer-x86_64-linux-fast/build/llvm_build_asan/bin/clang-repl "int i = 10;" 'extern "C" int printf(const char*,...);'             'auto r1 = printf("i = %d\n", i);' | /b/sanitizer-x86_64-linux-fast/build/llvm_build_asan/bin/FileCheck --check-prefix=CHECK-DRIVER /b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/test/Interpreter/execute.cpp
: 'RUN: at line 8';   cat /b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/test/Interpreter/execute.cpp | /b/sanitizer-x86_64-linux-fast/build/llvm_build_asan/bin/clang-repl | /b/sanitizer-x86_64-linux-fast/build/llvm_build_asan/bin/FileCheck /b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/test/Interpreter/execute.cpp
--
Exit Code: 1
Command Output (stderr):
--
=================================================================
==67042==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 3384 byte(s) in 3 object(s) allocated from:
    #0 0x44fbefd in operator new(unsigned long) /b/s/w/ir/cache/builder/src/third_party/llvm/compiler-rt/lib/asan/asan_new_delete.cpp:95:3
    #1 0x4bb65ad in llvm::RegisterTargetMachine<llvm::X86TargetMachine>::Allocator(llvm::Target const&, llvm::Triple const&, llvm::StringRef, llvm::StringRef, llvm::TargetOptions const&, llvm::Optional<llvm::Reloc::Model>, llvm::Optional<llvm::CodeModel::Model>, llvm::CodeGenOpt::Level, bool) /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/Support/TargetRegistry.h:1209:12
    #2 0x6acad7f in createTargetMachine /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/Support/TargetRegistry.h:429:12
    #3 0x6acad7f in (anonymous namespace)::EmitAssemblyHelper::CreateTargetMachine(bool) /b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/lib/CodeGen/BackendUtil.cpp:907:23
    #4 0x6ab5a43 in (anonymous namespace)::EmitAssemblyHelper::EmitAssemblyWithNewPassManager(clang::BackendAction, std::__1::unique_ptr<llvm::raw_pwrite_stream, std::__1::default_delete<llvm::raw_pwrite_stream> >) /b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/lib/CodeGen/BackendUtil.cpp:1195:3
    #5 0x6aac51b in clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::HeaderSearchOptions const&, clang::CodeGenOptions const&, clang::TargetOptions const&, clang::LangOptions const&, llvm::StringRef, llvm::Module*, clang::BackendAction, std::__1::unique_ptr<llvm::raw_pwrite_stream, std::__1::default_delete<llvm::raw_pwrite_stream> >) /b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/lib/CodeGen/BackendUtil.cpp:1654:15
    #6 0x6aa0610 in clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) /b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/lib/CodeGen/CodeGenAction.cpp:334:7
    #7 0x59ba3bf in clang::IncrementalParser::ParseOrWrapTopLevelDecl() /b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/lib/Interpreter/IncrementalParser.cpp:177:13
    #8 0x59bc084 in clang::IncrementalParser::Parse(llvm::StringRef) /b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/lib/Interpreter/IncrementalParser.cpp:227:27
    #9 0x585dd64 in clang::Interpreter::Parse(llvm::StringRef) /b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/lib/Interpreter/Interpreter.cpp:202:22
    #10 0x4501f45 in clang::Interpreter::ParseAndExecute(llvm::StringRef) /b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/include/clang/Interpreter/Interpreter.h:61:29
    #11 0x4500605 in main /b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/tools/clang-repl/ClangRepl.cpp:95:30
    #12 0x7f625d26909a in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2409a)

Thanks @hctim!

I can reproduce the issue and I have a fix but I do not understand it:

diff
diff --git a/clang/test/Interpreter/execute.cpp b/clang/test/Interpreter/execute.cpp
index 730796bd4016..298046c068c3 100644
--- a/clang/test/Interpreter/execute.cpp
+++ b/clang/test/Interpreter/execute.cpp
@@ -2,11 +2,8 @@
 // RUN:            'auto r1 = printf("i = %d\n", i);' | FileCheck --check-prefix=CHECK-DRIVER %s
 // REQUIRES: host-supports-jit
 // UNSUPPORTED: system-aix
-
 // CHECK-DRIVER: i = 10
-
 // RUN: cat %s | clang-repl | FileCheck %s
-
 extern "C" int printf(const char *, ...);
 int i = 42;
 auto r1 = printf("i = %d\n", i);
@@ -16,5 +13,4 @@ struct S { float f = 1.0; S *m = nullptr;} s;
 
 auto r2 = printf("S[f=%f, m=0x%llx]\n", s.f, reinterpret_cast<unsigned long long>(s.m));
 // CHECK-NEXT: S[f=1.000000, m=0x0]
-
 quit

The original test in execute.cpp failed not the one that this review introduces. I suspect that somehow the cat command fails to pipe the quit to the interpreter due to new/empty lines...