Cannot compile crypto++ (camellia) with Xcode-6.0.x/clang-3.4+/llvm-3.4+

134 views
Skip to first unread message

Mouse

unread,
Oct 14, 2014, 3:36:10 PM10/14/14
to Crypto++ Users
Got a nasty problem: camellia.cpp crashes llvm compiler. 

I've submitted a bug report to llvm.com/bugs http://llvm.org/bugs/show_bug.cgi?id=21194, and they answered that llvm performs exactly as expected, and the problem is with the camellia code:

The user code is incorrect, clang already has the diagnosis. You must pass integer constants to assembly with the "i" constraint. You cannot thread one through an always_inline function. This is a well-known compatibility issue. You have to use a macro. Sorry. :(

...................

Justin and I discussed this.

Like Reid said, the assertion in LLVM is a fallout from the new diagnostic handler, but the errors reported are legit.

If it worked previously, this is likely by accident... Sorry.

To fix the compiler assertion, we would likely need to teach the pass manager the notion of a failure in a pass, so that it can stop the compilation process, since the MIR is not in the expected shape. Previously, the error reporting was aborting directly so we were not seeing that, but we would have get just the first error.


Here's what the compiler says:

clang++ -DNDEBUG -g -O2 -std=c++11 -ansi -maes -mpclmul -fPIC -ffunction-sections -fdata-sections -m64 -arch x86_64  -DCRYPTOPP_DISABLE_ASM -Wno-tautological-compare -c camellia.cpp

In file included from camellia.cpp:16:

./cpu.h:34:64: warning: unknown attribute '__artificial__' ignored

      [-Wattributes]

__inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__))

                                                               ^

./cpu.h:41:68: warning: unknown attribute '__artificial__' ignored

      [-Wattributes]

__inline __m128i __attribute__((__gnu_inline__, __always_inline__, __art...

                                                                   ^

./cpu.h:38:7: error: invalid operand for inline asm constraint 'i'

        asm ("pextrd %2, %1, %0" : "=rm"(r) : "x"(a), "i"(i));

             ^

./cpu.h:44:7: error: invalid operand for inline asm constraint 'i'

        asm ("pinsrd %2, %1, %0" : "+x"(a) : "rm"(b), "i"(i));

             ^

Assertion failed: (MRI->getVRegDef(reg) && "Register use before def!"), function HandleVirtRegUse, file LiveVariables.cpp, line 133.

0  libLLVM-3.4.dylib        0x000000010b4938e9 llvm::sys::PrintStackTrace(__sFILE*) + 40

1  libLLVM-3.4.dylib        0x000000010b493cd9 SignalHandler(int) + 248

2  libsystem_platform.dylib 0x00007fff89cb25aa _sigtramp + 26

3  libsystem_platform.dylib 000000000000000000 _sigtramp + 1983175280

4  libLLVM-3.4.dylib        0x000000010b493b40 abort + 22

5  libLLVM-3.4.dylib        0x000000010b493b2a abort + 0

6  libLLVM-3.4.dylib        0x000000010ade57f9 llvm::LiveVariables::HandleVirtRegUse(unsigned int, llvm::MachineBasicBlock*, llvm::MachineInstr*) + 363

7  libLLVM-3.4.dylib        0x000000010ade708b llvm::LiveVariables::runOnMachineFunction(llvm::MachineFunction&) + 1339

8  libLLVM-3.4.dylib        0x000000010ae06b60 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) + 48

9  libLLVM-3.4.dylib        0x000000010af68239 llvm::FPPassManager::runOnFunction(llvm::Function&) + 297

10 libLLVM-3.4.dylib        0x000000010af683d1 llvm::FPPassManager::runOnModule(llvm::Module&) + 41

11 libLLVM-3.4.dylib        0x000000010af68728 llvm::legacy::PassManagerImpl::run(llvm::Module&) + 648

12 clang                    0x000000010980b7f4 clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::CodeGenOptions const&, clang::TargetOptions const&, clang::LangOptions const&, llvm::Module*, clang::BackendAction, llvm::raw_ostream*) + 5034

13 clang                    0x00000001098e17b0 clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) + 422

14 clang                    0x00000001099248c7 clang::ParseAST(clang::Sema&, bool, bool) + 348

15 clang                    0x00000001098e0ec0 clang::CodeGenAction::ExecuteAction() + 484

16 clang                    0x000000010970c79b clang::FrontendAction::Execute() + 103

17 clang                    0x00000001096efdcf clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) + 571

18 clang                    0x00000001096c6629 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) + 3861

19 clang                    0x00000001096c017a cc1_main(char const**, char const**, char const*, void*) + 794

20 clang                    0x00000001096c4c2d main + 6504

21 libdyld.dylib            0x00007fff937155fd start + 1

22 libdyld.dylib            0x000000000000003e start + 1821289026

Stack dump:

0. Program arguments: /opt/local/libexec/llvm-3.4/bin/clang -cc1 -triple x86_64-apple-macosx10.9.0 -emit-obj -disable-free -main-file-name camellia.cpp -mrelocation-model pic -pic-level 2 -mdisable-fp-elim -masm-verbose -munwind-tables -target-cpu core2 -target-feature +aes -target-feature +pclmul -target-linker-version 236.3 -gdwarf-2 -ffunction-sections -fdata-sections -coverage-file /Users/ur20980/src/cryptopp-5.6.2-clang/camellia.o -resource-dir /opt/local/libexec/llvm-3.4/bin/../lib/clang/3.4.2 -D NDEBUG -D CRYPTOPP_DISABLE_ASM -stdlib=libc++ -O2 -Wno-tautological-compare -std=c++98 -fdeprecated-macro -fdebug-compilation-dir /Users/ur20980/src/cryptopp-5.6.2-clang -ferror-limit 19 -fmessage-length 80 -stack-protector 1 -mstackrealign -fblocks -fobjc-runtime=macosx-10.9.0 -fencode-extended-block-signature -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -vectorize-loops -vectorize-slp -o camellia.o -x c++ camellia.cpp

1. <eof> parser at end of file

2. Code generation

3. Running pass 'Function Pass Manager' on module 'camellia.cpp'.

4. Running pass 'Live Variable Analysis' on function '@_Z16_mm_insert_epi32Dv2_xii'

clang: error: unable to execute command: Illegal instruction: 4

clang: error: clang frontend command failed due to signal (use -v to see invocation)

clang version 3.4.2 (tags/RELEASE_34/dot2-final)

Target: x86_64-apple-darwin13.4.0

Thread model: posix

clang: note: diagnostic msg: PLEASE submit a bug report to http://llvm.org/bugs/ and include the crash backtrace, preprocessed source, and associated run script.

clang: note: diagnostic msg:

********************


PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:

Preprocessed source(s) and associated run script(s) are located at:

clang: note: diagnostic msg: /var/folders/c6/lnc_0m093ys8w16md_fm1mnxhtfnj8/T/camellia-20466f.cpp

clang: note: diagnostic msg: /var/folders/c6/lnc_0m093ys8w16md_fm1mnxhtfnj8/T/camellia-20466f.sh

clang: note: diagnostic msg:


********************

make: *** [camellia.o] Error 254


A solution to this problem/bug would be nice!  According to LLVM people, those inline functions should be changed to macros...?

--
Regards,
Mouse

Mouse

unread,
Oct 14, 2014, 4:43:35 PM10/14/14
to Crypto++ Users
Update. Attached is the patch to cpu.h that gets crypto++-5.6.2 compile and run correctly under Xcode-6.0.1. Attaching my GNUmakefile diff just in case - it adds quite a bit of customization and support for dynamic linking under Mac OS X.

Wei, it would be really nice if you could incorporate these changes, especially the GNUmakefile. It is tiresome to re-enable Mac OS X specifics with every release. :-)

--
Regards,
Mouse

makefile.diff
cpu.h.diff

Jeffrey Walton

unread,
Dec 1, 2014, 7:12:53 PM12/1/14
to cryptop...@googlegroups.com, mous...@gmail.com

On Tuesday, October 14, 2014 4:43:35 PM UTC-4, Mouse wrote:
Update. Attached is the patch to cpu.h that gets crypto++-5.6.2 compile and run correctly under Xcode-6.0.1. Attaching my GNUmakefile diff just in case - it adds quite a bit of customization and support for dynamic linking under Mac OS X.

Wei, it would be really nice if you could incorporate these changes, especially the GNUmakefile. It is tiresome to re-enable Mac OS X specifics with every release. :-)
Out of curiosity, is this a problem with Clang/OS X, or a problem with Clang in general?
 
Will the problem surface using Clang/iOS combination, or Clang/Linux?
 
(Sorry to have to ask. `make test` usually works for me, so I don't see this problem).
 
Jeff

Mobile Mouse

unread,
Dec 1, 2014, 10:15:10 PM12/1/14
to Jeffrey Walton, cryptop...@googlegroups.com
Since I don't use clang on platforms other than OSX, I cannot tell what behavior it exhibits on iOS or Linux. 

But I can tell that the OSX customizations I applied appear necessary (tested up to Mavericks 10.9.5), especially if you want to use dynamic libraries and such, and I'd greatly appreciate if they are added to the distro. 

Sent from my iPad
Reply all
Reply to author
Forward
0 new messages