Quuxplusone / LLVMBugzillaTest

0 stars 0 forks source link

Modules crash-on-invalid due to struct declaration in one module, struct definition in another, but no direct dependency between the two #36941

Open Quuxplusone opened 6 years ago

Quuxplusone commented 6 years ago
Bugzilla Link PR37968
Status NEW
Importance P enhancement
Reported by David Blaikie (dblaikie@gmail.com)
Reported on 2018-06-27 11:09:46 -0700
Last modified on 2018-06-27 11:15:09 -0700
Version trunk
Hardware PC Linux
CC dgregor@apple.com, llvm-bugs@lists.llvm.org, richard-llvm@metafoo.co.uk
Fixed by commit(s)
Attachments
Blocks
Blocked by
See also
This one is a bit involved to reproduce - at least I haven't been able to get
it down below 3 module interface units and a module implementation unit as
follows:

a.cppm:
  export module a;
  export struct a {
    virtual ~a();
  };

b.cppm:
  export module b;
  import a;
  export struct b : a {
  };

x.cppm:
  export module x;
  struct a;
  export struct x {
    a *m;
    x();
  }

x.cpp:
  module x;
  import b;
  import a; // Buggily required import, likely (will be filed separately)
  y::y() { new b(); }

compiled as:

$ clang++ -fmodules-ts -c -std=c++17 -Xclang -fmodules-codegen --precompile
a.cppm
$ clang++ -fmodules-ts -c -std=c++17 -Xclang -fmodules-codegen --precompile
b.cppm -fmodule-file=a.pcm
$ clang++ -fmodules-ts -c -std=c++17 -Xclang -fmodules-codegen --precompile
FruitBowl.cppm -fmodule-file=x.pcm
clang++-tot -fmodules-ts -c -std=c++17 x.cpp -fmodule-file=a.pcm -fmodule-
file=b.pcm -fmodule-file=x.pcm

The crash trace is as follows (apologies for any bad line wrapping):

clang-5.0:
/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/lib/AST/Decl.cpp:1422:
clang::LinkageInfo clang::LinkageComputer::getLVFo
rDecl(const clang::NamedDecl *, clang::LVComputationKind): Assertion `D-
>getCachedLinkage() == LV.getLinkage()' failed.
Stack dump:
0.      Program arguments:
/usr/local/google/home/blaikie/dev/llvm/build/default/bin/clang-5.0 -cc1 -
triple x86_64-unknown-linux-gnu -emit-o
bj -mrelax-all -disable-free -main-file-name FruitBowl.cpp -mrelocation-model
static -mthread-model posix -mdisable-fp-elim -fmath-errno -ma
sm-verbose -mconstructor-aliases -munwind-tables -fuse-init-array -target-cpu
x86-64 -dwarf-column-info -debugger-tuning=gdb -coverage-notes
-file
/usr/local/google/home/blaikie/dev/scratch/modules_cached_linkage_crash/FruitBowl.gcno
-resource-dir /usr/local/google/home/blaikie/de
v/llvm/build/default/lib/clang/7.0.0 -internal-isystem /usr/lib/gcc/x86_64-
linux-gnu/7.3.0/../../../../include/c++/7.3.0 -internal-isystem /
usr/lib/gcc/x86_64-linux-gnu/7.3.0/../../../../include/x86_64-linux-
gnu/c++/7.3.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.3.0/../.
./../../include/x86_64-linux-gnu/c++/7.3.0 -internal-isystem
/usr/lib/gcc/x86_64-linux-gnu/7.3.0/../../../../include/c++/7.3.0/backward -int
ernal-isystem /usr/local/include -internal-isystem
/usr/local/google/home/blaikie/dev/llvm/build/default/lib/clang/7.0.0/include -
internal-e
xternc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include
-internal-externc-isystem /usr/include -std=c++17 -fdeprecat
ed-macro -fdebug-compilation-dir
/usr/local/google/home/blaikie/dev/scratch/modules_cached_linkage_crash -ferror-
limit 19 -fmessage-length 1
40 -fmodules-ts -fno-implicit-modules -fmodule-file=AbstractFruit.pcm -fmodule-
file=Apple.pcm -fmodule-file=FruitBowl.pcm -fobjc-runtime=gcc
 -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -o FruitBowl.o -x c++ FruitBowl.cpp
1.      <eof> parser at end of file
2.      Per-file LLVM IR generation
3.
/usr/local/google/home/blaikie/dev/scratch/modules_cached_linkage_crash/Apple.cppm:3:15:
Generating code for declaration 'b::~b'
#0 0x0000000006ddf5a9 llvm::sys::PrintStackTrace(llvm::raw_ostream&)
/usr/local/google/home/blaikie/dev/llvm/src/lib/Support/Unix/Signals.in
c:490:11
#1 0x0000000006ddf759 PrintStackTraceSignalHandler(void*)
/usr/local/google/home/blaikie/dev/llvm/src/lib/Support/Unix/Signals.inc:554:1
#2 0x0000000006ddda46 llvm::sys::RunSignalHandlers()
/usr/local/google/home/blaikie/dev/llvm/src/lib/Support/Signals.cpp:66:5
#3 0x0000000006ddfd87 SignalHandler(int)
/usr/local/google/home/blaikie/dev/llvm/src/lib/Support/Unix/Signals.inc:353:1
#4 0x00007f2b1af8e0c0 __restore_rt (/lib/x86_64-linux-
gnu/libpthread.so.0+0x110c0)
#5 0x00007f2b19b21fcf gsignal (/lib/x86_64-linux-gnu/libc.so.6+0x32fcf)
#6 0x00007f2b19b233fa abort (/lib/x86_64-linux-gnu/libc.so.6+0x343fa)
#7 0x00007f2b19b1ae37 (/lib/x86_64-linux-gnu/libc.so.6+0x2be37)
#8 0x00007f2b19b1aee2 (/lib/x86_64-linux-gnu/libc.so.6+0x2bee2)
#9 0x000000000a920ff9 clang::LinkageComputer::getLVForDecl(clang::NamedDecl
const*, clang::LVComputationKind) /usr/local/google/home/blaikie
/dev/llvm/src/tools/clang/lib/AST/Decl.cpp:1422:5
#10 0x000000000a922593
clang::LinkageComputer::getDeclLinkageAndVisibility(clang::NamedDecl const*)
/usr/local/google/home/blaikie/dev/llvm/
src/tools/clang/lib/AST/Decl.cpp:1455:10
#11 0x000000000a923f5b clang::NamedDecl::getLinkageAndVisibility() const
/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/lib/AST/Dec
l.cpp:1071:28
#12 0x00000000072da959 setLinkageForGV(llvm::GlobalValue*, clang::NamedDecl
const*) /usr/local/google/home/blaikie/dev/llvm/src/tools/clang/
lib/CodeGen/CodeGenModule.cpp:1413:24
#13 0x00000000072da622
clang::CodeGen::CodeGenModule::SetFunctionAttributes(clang::GlobalDecl,
llvm::Function*, bool, bool) /usr/local/googl
e/home/blaikie/dev/llvm/src/tools/clang/lib/CodeGen/CodeGenModule.cpp:1487:19
#14 0x00000000072deba1
clang::CodeGen::CodeGenModule::GetOrCreateLLVMFunction(llvm::StringRef,
llvm::Type*, clang::GlobalDecl, bool, bool, b
ool, llvm::AttributeList, clang::CodeGen::ForDefinition_t)
/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/lib/CodeGen/CodeGenModule
.cpp:2555:18
#15 0x0000000007485ded
clang::CodeGen::CodeGenModule::getAddrOfCXXStructor(clang::CXXMethodDecl
const*, clang::CodeGen::StructorType, clang:
:CodeGen::CGFunctionInfo const*, llvm::FunctionType*, bool,
clang::CodeGen::ForDefinition_t)
/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/lib/CodeGen/CGCXX.cpp:253:3
#16 0x00000000076fbbb8 (anonymous
namespace)::ItaniumCXXABI::EmitDestructorCall(clang::CodeGen::CodeGenFunction&,
clang::CXXDestructorDecl const*, clang::CXXDtorType, bool, bool,
clang::CodeGen::Address)
/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/lib/CodeGen/ItaniumCXXABI.cpp:1567:27
#17 0x000000000746e1cd
clang::CodeGen::CodeGenFunction::EmitCXXDestructorCall(clang::CXXDestructorDecl
const*, clang::CXXDtorType, bool, bool, clang::CodeGen::Address)
/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/lib/CodeGen/CGClass.cpp:2371:1
#18 0x000000000747b96f (anonymous
namespace)::CallBaseDtor::Emit(clang::CodeGen::CodeGenFunction&,
clang::CodeGen::EHScopeStack::Cleanup::Flags)
/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/lib/CodeGen/CGClass.cpp:499:5
#19 0x000000000742a7c9 EmitCleanup(clang::CodeGen::CodeGenFunction&,
clang::CodeGen::EHScopeStack::Cleanup*,
clang::CodeGen::EHScopeStack::Cleanup::Flags, clang::CodeGen::Address)
/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/lib/CodeGen/CGCleanup.cpp:569:3
#20 0x0000000007428f5d clang::CodeGen::CodeGenFunction::PopCleanupBlock(bool)
/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/lib/CodeGen/CGCleanup.cpp:775:5
#21 0x00000000074284a3
clang::CodeGen::CodeGenFunction::PopCleanupBlocks(clang::CodeGen::EHScopeStack::stable_iterator,
std::initializer_list<llvm::Value**>)
/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/lib/CodeGen/CGCleanup.cpp:426:3
#22 0x0000000007429fce
clang::CodeGen::CodeGenFunction::PopCleanupBlocks(clang::CodeGen::EHScopeStack::stable_iterator,
unsigned long, std::initializer_list<llvm::Value**>)
/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/lib/CodeGen/CGCleanup.cpp:482:19
#23 0x000000000741fb4e
clang::CodeGen::CodeGenFunction::RunCleanupsScope::ForceCleanup(std::initializer_list<llvm::Value**>)
/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/lib/CodeGen/CodeGenFunction.h:639:22
#24 0x000000000746d8dc
clang::CodeGen::CodeGenFunction::EmitDestructorBody(clang::CodeGen::FunctionArgList&)
/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/lib/CodeGen/CGClass.cpp:1508:7
#25 0x000000000744e4ff
clang::CodeGen::CodeGenFunction::GenerateCode(clang::GlobalDecl,
llvm::Function*, clang::CodeGen::CGFunctionInfo const&)
/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/lib/CodeGen/CodeGenFunction.cpp:1341:5
#26 0x0000000007485b05
clang::CodeGen::CodeGenModule::codegenCXXStructor(clang::CXXMethodDecl const*,
clang::CodeGen::StructorType)
/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/lib/CodeGen/CGCXX.cpp:225:3
#27 0x00000000076ff69c (anonymous
namespace)::ItaniumCXXABI::emitCXXStructor(clang::CXXMethodDecl const*,
clang::CodeGen::StructorType)
/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/lib/CodeGen/ItaniumCXXABI.cpp:3842:19
#28 0x00000000072dbd67
clang::CodeGen::CodeGenModule::EmitGlobalDefinition(clang::GlobalDecl,
llvm::GlobalValue*)
/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/lib/CodeGen/CodeGenModule.cpp:2335:9
#29 0x00000000072d2d5e clang::CodeGen::CodeGenModule::EmitDeferred()
/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/lib/CodeGen/CodeGenModule.cpp:1761:10
#30 0x00000000072d2da0 clang::CodeGen::CodeGenModule::EmitDeferred()
/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/lib/CodeGen/CodeGenModule.cpp:1763:7
#31 0x00000000072d2da0 clang::CodeGen::CodeGenModule::EmitDeferred()
/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/lib/CodeGen/CodeGenModule.cpp:1763:7
#32 0x00000000072d2da0 clang::CodeGen::CodeGenModule::EmitDeferred()
/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/lib/CodeGen/CodeGenModule.cpp:1763:7
#33 0x00000000072d13c5 clang::CodeGen::CodeGenModule::Release()
/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/lib/CodeGen/CodeGenModule.cpp:393:3
#34 0x0000000007cbcdc2 (anonymous
namespace)::CodeGeneratorImpl::HandleTranslationUnit(clang::ASTContext&)
/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/lib/CodeGen/ModuleBuilder.cpp:269:11
#35 0x0000000007cb7b1e
clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&)
/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/lib/CodeGen/CodeGenAction.cpp:236:14
#36 0x000000000953b1c9 clang::ParseAST(clang::Sema&, bool, bool)
/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/lib/Parse/ParseAST.cpp:171:12
#37 0x0000000007b0b042 clang::ASTFrontendAction::ExecuteAction()
/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/lib/Frontend/FrontendAction.cpp:1013:1
#38 0x0000000007cb5652 clang::CodeGenAction::ExecuteAction()
/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/lib/CodeGen/CodeGenAction.cpp:1044:1
#39 0x0000000007b0aa80 clang::FrontendAction::Execute()
/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/lib/Frontend/FrontendAction.cpp:914:7
#40 0x00000000079de339
clang::CompilerInstance::ExecuteAction(clang::FrontendAction&)
/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/lib/Frontend/CompilerInstance.cpp:990:7
#41 0x0000000007c9fc3f
clang::ExecuteCompilerInvocation(clang::CompilerInstance*)
/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:257:8
#42 0x00000000043b4196 cc1_main(llvm::ArrayRef<char const*>, char const*,
void*)
/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/tools/driver/cc1_main.cpp:222:11
#43 0x00000000043a7462 ExecuteCC1Tool(llvm::ArrayRef<char const*>,
llvm::StringRef)
/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/tools/driver/driver.cpp:310:5
#44 0x00000000043a6094 main
/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/tools/driver/driver.cpp:382:5
#45 0x00007f2b19b0f2b1 __libc_start_main (/lib/x86_64-linux-
gnu/libc.so.6+0x202b1)
#46 0x00000000043a502a _start
(/usr/local/google/home/blaikie/dev/llvm/build/default/bin/clang-5.0+0x43a502a)
Quuxplusone commented 6 years ago

I believe the issue is that the merging we perform when loading AST files does not take module ownership into account. We should not be merging the 'a' from module 'a' with the 'a' from module 'x', because they are owned by different modules.

Quuxplusone commented 6 years ago

(typo there, should be x::x in x.cpp, of course)