avr-llvm / llvm

[MERGED UPSTREAM] AVR backend for the LLVM compiler library
220 stars 21 forks source link

Call instruction does not support symbolic operands #94

Closed dylanmckay closed 9 years ago

dylanmckay commented 9 years ago

The custom call operand encoder asserts that the operand of a call instruction is an immediate value. This may not always be the case, for example, when the call target points to a label.

In this case, the operand is of type MCExpr. Currently the following code will not compile:

asdf:
    call asdf

Note that the CALL k and JMP k functions are (probably, but it should still be double checked) the only functions to use the custom call encoding, so these are the only affected instructions.

Output of llvm-mc -arch=avr -mcpu=avrxmega1 -filetype=obj -o a.out:

/home/dylan/projects/llvm/lib/Target/AVR/MCTargetDesc/AVRMCCodeEmitter.cpp:239: unsigned int llvm::AVRMCCodeEmitter::getCallTargetEncoding(const llvm::MCInst&, unsigned int, llvm::SmallVectorImpl<llvm::MCFixup>&, const llvm::MCSubtargetInfo&) const: Assertion `MO.isImm()' failed.
#0 0x52ebd9 llvm::sys::PrintStackTrace(llvm::raw_ostream&) /home/dylan/projects/llvm/lib/Support/Unix/Signals.inc:431:0
#1 0x52ef55 PrintStackTraceSignalHandler(void*) /home/dylan/projects/llvm/lib/Support/Unix/Signals.inc:489:0
#2 0x52db2d SignalHandler(int) /home/dylan/projects/llvm/lib/Support/Unix/Signals.inc:205:0
#3 0x7f40daff4740 __restore_rt (/usr/lib/libpthread.so.0+0x10740)
#4 0x7f40da2344b7 __GI_raise (/usr/lib/libc.so.6+0x334b7)
#5 0x7f40da23588a __GI_abort (/usr/lib/libc.so.6+0x3488a)
#6 0x7f40da22d41d __assert_fail_base (/usr/lib/libc.so.6+0x2c41d)
#7 0x7f40da22d4d2 (/usr/lib/libc.so.6+0x2c4d2)
#8 0x4247bd llvm::AVRMCCodeEmitter::getCallTargetEncoding(llvm::MCInst const&, unsigned int, llvm::SmallVectorImpl<llvm::MCFixup>&, llvm::MCSubtargetInfo const&) const /home/dylan/projects/llvm/lib/Target/AVR/MCTargetDesc/AVRMCCodeEmitter.cpp:241:0
#9 0x424ee1 llvm::AVRMCCodeEmitter::getBinaryCodeForInstr(llvm::MCInst const&, llvm::SmallVectorImpl<llvm::MCFixup>&, llvm::MCSubtargetInfo const&) const /home/dylan/projects/builds/llvm/lib/Target/AVR/AVRGenMCCodeEmitter.inc:283:0
#10 0x4242ce llvm::AVRMCCodeEmitter::EncodeInstruction(llvm::MCInst const&, llvm::raw_ostream&, llvm::SmallVectorImpl<llvm::MCFixup>&, llvm::MCSubtargetInfo const&) const /home/dylan/projects/llvm/lib/Target/AVR/MCTargetDesc/AVRMCCodeEmitter.cpp:61:0
#11 0x46f636 llvm::MCELFStreamer::EmitInstToData(llvm::MCInst const&, llvm::MCSubtargetInfo const&) /home/dylan/projects/llvm/lib/MC/MCELFStreamer.cpp:483:0
#12 0x484188 llvm::MCObjectStreamer::EmitInstruction(llvm::MCInst const&, llvm::MCSubtargetInfo const&) /home/dylan/projects/llvm/lib/MC/MCObjectStreamer.cpp:225:0
#13 0x41d123 (anonymous namespace)::AVRAsmParser::MatchAndEmitInstruction(llvm::SMLoc, unsigned int&, llvm::SmallVectorImpl<std::unique_ptr<llvm::MCParsedAsmOperand, std::default_delete<llvm::MCParsedAsmOperand> > >&, llvm::MCStreamer&, unsigned long&, bool) /home/dylan/projects/llvm/lib/Target/AVR/AsmParser/AVRAsmParser.cpp:252:0
#14 0x49e7b4 (anonymous namespace)::AsmParser::parseStatement((anonymous namespace)::ParseStatementInfo&, llvm::MCAsmParserSemaCallback*) /home/dylan/projects/llvm/lib/MC/MCParser/AsmParser.cpp:1657:0
#15 0x499d18 (anonymous namespace)::AsmParser::Run(bool, bool) /home/dylan/projects/llvm/lib/MC/MCParser/AsmParser.cpp:646:0
#16 0x4058f6 AssembleInput(char const*, llvm::Target const*, llvm::SourceMgr&, llvm::MCContext&, llvm::MCStreamer&, llvm::MCAsmInfo&, llvm::MCSubtargetInfo&, llvm::MCInstrInfo&, llvm::MCTargetOptions&) /home/dylan/projects/llvm/tools/llvm-mc/llvm-mc.cpp:337:0
#17 0x40686a main /home/dylan/projects/llvm/tools/llvm-mc/llvm-mc.cpp:497:0
#18 0x7f40da221800 __libc_start_main (/usr/lib/libc.so.6+0x20800)
#19 0x404bc9 _start (/home/dylan/projects/builds/llvm/bin/llvm-mc+0x404bc9)
Stack dump:
0.      Program arguments: ./llvm-mc -arch=avr -mcpu=avrxmega1 -filetype=obj -o a.out 
[1]    7841 abort (core dumped)  ./llvm-mc -arch=avr -mcpu=avrxmega1 -filetype=obj -o a.out