avr-llvm / llvm

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

Segmentation fault during instruction selection #142

Closed dylanmckay closed 9 years ago

dylanmckay commented 9 years ago

A segmentation fault is generating during instruction selection when compiling wiring_analog.c from the Arduino core.

wiring_analog.ll.

Output:

#0 0x132b14b llvm::sys::PrintStackTrace(llvm::raw_ostream&) /home/dylan/projects/avr-llvm/llvm/lib/Support/Unix/Signals.inc:437:0
#1 0x132b4c8 PrintStackTraceSignalHandler(void*) /home/dylan/projects/avr-llvm/llvm/lib/Support/Unix/Signals.inc:495:0
#2 0x132a09f SignalHandler(int) /home/dylan/projects/avr-llvm/llvm/lib/Support/Unix/Signals.inc:210:0
#3 0x7fbfa33ca660 __restore_rt (/usr/lib/libpthread.so.0+0x10660)
#4 0x9e6664 llvm::Value::getType() const /home/dylan/projects/avr-llvm/llvm/include/llvm/IR/Value.h:222:0
#5 0x9fcbc8 bool llvm::AVR::isProgramMemoryAddress<llvm::Value const>(llvm::Value const*) /home/dylan/projects/avr-llvm/llvm/lib/Target/AVR/AVR.h:48:0
#6 0x9fbf3f llvm::AVR::isProgramMemoryAccess(llvm::MemSDNode const*) /home/dylan/projects/avr-llvm/llvm/lib/Target/AVR/AVR.h:55:0
#7 0x9f93cf llvm::SDNode* llvm::AVRDAGToDAGISel::select<157u>(llvm::SDNode*) /home/dylan/projects/avr-llvm/llvm/lib/Target/AVR/AVRISelDAGToDAG.cpp:400:0
#8 0x9fa5dd llvm::AVRDAGToDAGISel::Select(llvm::SDNode*) /home/dylan/projects/avr-llvm/llvm/lib/Target/AVR/AVRISelDAGToDAG.cpp:571:0
#9 0x1172e73 llvm::SelectionDAGISel::DoInstructionSelection() /home/dylan/projects/avr-llvm/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:892:0
#10 0x11727f3 llvm::SelectionDAGISel::CodeGenAndEmitDAG() /home/dylan/projects/avr-llvm/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:791:0
#11 0x1175b2e llvm::SelectionDAGISel::FinishBasicBlock() /home/dylan/projects/avr-llvm/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1568:0
#12 0x1174827 llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) /home/dylan/projects/avr-llvm/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1317:0
#13 0x117072c llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) /home/dylan/projects/avr-llvm/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:465:0
#14 0x9f7edf llvm::AVRDAGToDAGISel::runOnMachineFunction(llvm::MachineFunction&) /home/dylan/projects/avr-llvm/llvm/lib/Target/AVR/AVRISelDAGToDAG.cpp:69:0
#15 0xbd3f11 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) /home/dylan/projects/avr-llvm/llvm/lib/CodeGen/MachineFunctionPass.cpp:41:0
#16 0xf89aa3 llvm::FPPassManager::runOnFunction(llvm::Function&) /home/dylan/projects/avr-llvm/llvm/lib/IR/LegacyPassManager.cpp:1520:0
#17 0xf89c02 llvm::FPPassManager::runOnModule(llvm::Module&) /home/dylan/projects/avr-llvm/llvm/lib/IR/LegacyPassManager.cpp:1540:0
#18 0xf89f31 (anonymous namespace)::MPPassManager::runOnModule(llvm::Module&) /home/dylan/projects/avr-llvm/llvm/lib/IR/LegacyPassManager.cpp:1596:0
#19 0xf8a592 llvm::legacy::PassManagerImpl::run(llvm::Module&) /home/dylan/projects/avr-llvm/llvm/lib/IR/LegacyPassManager.cpp:1698:0
#20 0xf8a797 llvm::legacy::PassManager::run(llvm::Module&) /home/dylan/projects/avr-llvm/llvm/lib/IR/LegacyPassManager.cpp:1730:0
#21 0x9c9b65 compileModule(char**, llvm::LLVMContext&) /home/dylan/projects/avr-llvm/llvm/tools/llc/llc.cpp:367:0
#22 0x9c8cdd main /home/dylan/projects/avr-llvm/llvm/tools/llc/llc.cpp:204:0
#23 0x7fbfa2586790 __libc_start_main (/usr/lib/libc.so.6+0x20790)
#24 0x9c7ae9 _start (/home/dylan/projects/builds/avr-llvm/llvm/bin/llc+0x9c7ae9)
Stack dump:
0.      Program arguments: ./llc -march=avr -mcpu=atmega328p -filetype=obj -O0 -o tmp_arduino/wiring_analog.o /home/dylan/arduino-core/wiring_analog.ll 
1.      Running pass 'Function Pass Manager' on module '/home/dylan/arduino-core/wiring_analog.ll'.
2.      Running pass 'AVR DAG->DAG Instruction Selection' on function '@analogWrite'

A quick debugging session shows that isProgramMemoryAddress is being called by isProgramMemoryAccess, and the value N->getMemOperand()->getValue() is returning a null pointer.

Command line:

llc -march=avr -mcpu=atmega328p -filetype=obj -O0 -o wiring_analog.o wiring_analog.ll
dylanmckay commented 9 years ago

Fixed in 77d5497314e0040e574d70ee0332b58e636e0b84.