for all defined functions. Fixes crashes in function calls.tags/mesa_20090313
| @@ -508,19 +508,21 @@ translate_instruction(llvm::Module *module, | |||
| case TGSI_OPCODE_BGNSUB: { | |||
| instr->bgnSub(instno, storage); | |||
| storage->setCurrentBlock(instr->currentBlock()); | |||
| storage->pushTemps(); | |||
| return; | |||
| } | |||
| break; | |||
| case TGSI_OPCODE_ENDLOOP2: { | |||
| instr->endLoop(); | |||
| storage->setCurrentBlock(instr->currentBlock()); | |||
| storage->popArguments(); | |||
| return; | |||
| } | |||
| break; | |||
| case TGSI_OPCODE_ENDSUB: { | |||
| instr->endSub(); | |||
| storage->setCurrentBlock(instr->currentBlock()); | |||
| storage->popArguments(); | |||
| storage->popTemps(); | |||
| return; | |||
| } | |||
| break; | |||
| @@ -369,3 +369,24 @@ void Storage::popArguments() | |||
| m_CONST = arg.cst; | |||
| m_argStack.pop(); | |||
| } | |||
| void Storage::pushTemps() | |||
| { | |||
| m_tempStack.push(m_temps); | |||
| std::vector<llvm::Value*> oldTemps = m_temps; | |||
| m_temps = std::vector<llvm::Value*>(32); | |||
| int i = 0; | |||
| for (std::vector<llvm::Value*>::iterator itr = oldTemps.begin(); | |||
| itr != oldTemps.end(); ++itr) { | |||
| if (*itr) { | |||
| declareTemp(i); | |||
| } | |||
| ++i; | |||
| } | |||
| } | |||
| void Storage::popTemps() | |||
| { | |||
| m_temps = m_tempStack.top(); | |||
| m_tempStack.pop(); | |||
| } | |||
| @@ -84,6 +84,8 @@ public: | |||
| void pushArguments(llvm::Value *out, llvm::Value *in, | |||
| llvm::Value *constPtr); | |||
| void popArguments(); | |||
| void pushTemps(); | |||
| void popTemps(); | |||
| private: | |||
| llvm::Value *maskWrite(llvm::Value *src, int mask, llvm::Value *templ); | |||
| @@ -122,6 +124,7 @@ private: | |||
| llvm::Value *cst; | |||
| }; | |||
| std::stack<Args> m_argStack; | |||
| std::stack<std::vector<llvm::Value*> > m_tempStack; | |||
| }; | |||
| #endif | |||