I've been working this all morning, but have to step out for a bit now.

This is the short short version of what I have found so far:

- This affects all stack protector values on aarch64, not just
        -stack-protector 2. It is easier to trigger with 2 because it maps to
        -fstack-protector-strong, which inserts more stack protectors.

- Passing -O2 makes it work.

- We probably haven't noticed this before because we compile everything
        with -O2 by default.

- This is definitely a llvm8 thing - it worked on llvm7.

- insertSSPDeclarations() is supposed to only be used when
        getIRStackGuard() returns nullptr, so the existing behaviour in
        StackProtector and TargetLowering is correct.

- The real problem is that we are in the code path to lower the
        LOAD_STACK_GUARD pseudo instruction, which we do not support, and
        which assumes the SDag SSP, which we should be explicitly not using
        because we return something in getIRStackGuard().

I will have some more later.

Todd


On Sat, Jul 06, 2019 at 06:20:46PM -0600, Theo de Raadt wrote:
> + mortimer@
> 
> Krystian Lewandowski <k.lewandow...@me.com> wrote:
> 
> > Based on information from Dimitry Andric: 
> > https://bugs.llvm.org/show_bug.cgi?id=42478
> > - it does happen only for -triple aarch64-unknown-openbsd
> > - with -stack-protector 2
> > I tried to find a reason for this behaviour.  Please note I have no 
> > knowledge
> > about LLVM internals, dont trust me, double check.
> > 
> > I'll point to OpenBSD (master branch) github links, I hope its fine with 
> > you.
> > 
> > 1.  So the crash is caused directly by:
> > https://github.com/openbsd/src/blob/master/gnu/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp#L1500
> > where getValue() is called on NULL pointer.
> > 
> > 2.  I think it is caused by Global being NULL here:
> > https://github.com/openbsd/src/blob/master/gnu/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp#L766
> > It should be returned from provided module as __stack_chk_guard function.
> > https://github.com/openbsd/src/blob/master/gnu/llvm/lib/CodeGen/TargetLoweringBase.cpp#L1658
> > 
> > 3.  This "__stack_chk_guard" function should be registered here:
> > https://github.com/openbsd/src/blob/master/gnu/llvm/lib/CodeGen/StackProtector.cpp#L341
> >  by
> > insertSSPDeclarations() call but this piece of code is never executed 
> > because
> > getStackGuard() returns earlier - getIRStackGuard() returns non-NULL value:
> > https://github.com/openbsd/src/blob/master/gnu/llvm/lib/CodeGen/TargetLoweringBase.cpp#L1635
> > 
> > Im not sure which one is valid:
> > a.  with TargetLoweringBase::getIRStackGuard() returning non-NULL value,
> > TargetLoweringBase::getSDagStackGuard() should never be called by
> > IRTranslator::getStackGuard() and this flow should be handled in a 
> > different manner
> > b.  or insertSSPDeclarations() should be called in 
> > StackProtector::getStackGuard()
> > in both cases
> > 
> > I was able to get rid of crash by the diff below (b. case).
> > 
> > -- 
> > Krystian
> > 
> > Index: StackProtector.cpp
> > ===================================================================
> > RCS file: /cvs/src/gnu/llvm/lib/CodeGen/StackProtector.cpp,v
> > retrieving revision 1.8
> > diff -u -p -r1.8 StackProtector.cpp
> > --- StackProtector.cpp      23 Jun 2019 22:05:12 -0000      1.8
> > +++ StackProtector.cpp      5 Jul 2019 20:41:17 -0000
> > @@ -322,8 +322,10 @@ bool StackProtector::RequiresStackProtec
> >  static Value *getStackGuard(const TargetLoweringBase *TLI, Module *M,
> >                              IRBuilder<> &B,
> >                              bool *SupportsSelectionDAGSP = nullptr) {
> > -  if (Value *Guard = TLI->getIRStackGuard(B))
> > +  if (Value *Guard = TLI->getIRStackGuard(B)) {
> > +    TLI->insertSSPDeclarations(*M);
> >      return B.CreateLoad(Guard, true, "StackGuard");
> > +  }
> >  
> >    // Use SelectionDAG SSP handling, since there isn't an IR guard.
> >    //
> > 
> > > Wiadomość napisana przez Patrick Wildt <patr...@blueri.se> w dniu 
> > > 05.07.2019, o godz. 09:02:
> > > 
> > > On Tue, Jul 02, 2019 at 02:07:22PM +0200, Krystian Lewandowski wrote:
> > >> 
> > >>> Wiadomość napisana przez Krystian Lewandowski <k.lewandow...@me.com> w 
> > >>> dniu 01.07.2019, o godz. 21:50:
> > >>> 
> > >>> I thought it would be a good idea to rebuild cross-tools because of 
> > >>> LLVM version bump
> > >>> but - with recent src - I'm unable to do so:
> > >>> $ doas make -f Makefile.cross TARGET=${target} CROSSDIR="${destdir}" 
> > >>> cross-tools
> > >>> fails with:
> > >>> aarch64-unknown-openbsd6: error: unable to execute command: 
> > >>> Segmentation fault
> > >>> (core dumped)
> > >>> 
> > >>> With updated /etc/mk.conf:
> > >>> DEBUG=-gline-tables-only
> > >>> (I think it’s unused for clang but disables stripping during 
> > >>> installation?)
> > >>> 
> > >>> and src/gnu/usr.bin/clang/Makefile.inc:
> > >>> CPPFLAGS+=      -DNDEBUG -gline-tables-only
> > >>> (I think it’s similar to what cmake RelWithDebugInfo does.)
> > >>> 
> > >>> I was eventually able to get debug symbols. More details in attached 
> > >>> files.
> > >>> I reproduced this crash on other machine.
> > >>> 
> > >>> Is this something for LLVM team to look at?
> > >>> 
> > >>> If anyone would like to give it a quick try, then please just follow 
> > >>> „Setup” section from:
> > >>> https://github.com/elewarr/openbsd-arm64-src-dev
> > >>> 
> > >>> -- 
> > >>> Krystian
> > >>> 
> > >>> <cxa_demangle-042165.cpp.tgz><crash_log.txt><cxa_demangle-042165.sh><stack.txt>
> > >>> 
> > >>> 
> > >> 
> > >> Reported to LLVM: https://bugs.llvm.org/show_bug.cgi?id=42478
> > >> 
> > >> -- 
> > >> Krystian
> > >> 
> > > 
> > > I see this as well, what a bummer.  What I can see is that if I use my
> > > make wrapper to compile the files, and -j1, it doesn't crash.  I wonder
> > > what the big difference is.
> > > 
> > 

Reply via email to