[Lldb-commits] [PATCH] D19124: [LLDB] Added support for PHI nodes to IR interpreter
Zachary Turner via lldb-commits
lldb-commits at lists.llvm.org
Thu Apr 14 10:02:54 PDT 2016
I'll let Sean comment on the content of the patch, but please add a test
that runs such an expression and demonstrates the correct output.
On Thu, Apr 14, 2016 at 10:01 AM Cameron via lldb-commits <
lldb-commits at lists.llvm.org> wrote:
> cameron314 created this revision.
> cameron314 added a reviewer: spyffe.
> cameron314 added subscribers: mamai, lldb-commits.
> cameron314 set the repository for this revision to rL LLVM.
>
> This allows expressions such as 'i == 1 || i == 2` to be executed using
> the IR interpreter.
>
> Repository:
> rL LLVM
>
> http://reviews.llvm.org/D19124
>
> Files:
> source/Expression/IRInterpreter.cpp
>
> Index: source/Expression/IRInterpreter.cpp
> ===================================================================
> --- source/Expression/IRInterpreter.cpp
> +++ source/Expression/IRInterpreter.cpp
> @@ -106,6 +106,7 @@
> DataLayout &m_target_data;
> lldb_private::IRExecutionUnit &m_execution_unit;
> const BasicBlock *m_bb;
> + const BasicBlock *m_prev_bb;
> BasicBlock::const_iterator m_ii;
> BasicBlock::const_iterator m_ie;
>
> @@ -121,7 +122,9 @@
> lldb::addr_t stack_frame_bottom,
> lldb::addr_t stack_frame_top) :
> m_target_data (target_data),
> - m_execution_unit (execution_unit)
> + m_execution_unit (execution_unit),
> + m_bb (nullptr),
> + m_prev_bb (nullptr)
> {
> m_byte_order = (target_data.isLittleEndian() ?
> lldb::eByteOrderLittle : lldb::eByteOrderBig);
> m_addr_byte_size = (target_data.getPointerSize(0));
> @@ -137,6 +140,7 @@
>
> void Jump (const BasicBlock *bb)
> {
> + m_prev_bb = m_bb;
> m_bb = bb;
> m_ii = m_bb->begin();
> m_ie = m_bb->end();
> @@ -563,6 +567,7 @@
> case Instruction::Alloca:
> case Instruction::BitCast:
> case Instruction::Br:
> + case Instruction::PHI:
> break;
> case Instruction::Call:
> {
> @@ -1052,6 +1057,46 @@
> }
> }
> continue;
> + case Instruction::PHI:
> + {
> + const PHINode *phi_inst = dyn_cast<PHINode>(inst);
> +
> + if (!phi_inst)
> + {
> + if (log)
> + log->Printf("getOpcode() returns PHI, but
> instruction is not a PHINode");
> + error.SetErrorToGenericError();
> + error.SetErrorString(interpreter_internal_error);
> + return false;
> + }
> + if (!frame.m_prev_bb)
> + {
> + if (log)
> + log->Printf("Encountered PHI node without having
> jumped from another basic block");
> + error.SetErrorToGenericError();
> + error.SetErrorString(interpreter_internal_error);
> + return false;
> + }
> +
> + Value* value =
> phi_inst->getIncomingValueForBlock(frame.m_prev_bb);
> + lldb_private::Scalar result;
> + if (!frame.EvaluateValue(result, value, module))
> + {
> + if (log)
> + log->Printf("Couldn't evaluate %s",
> PrintValue(value).c_str());
> + error.SetErrorToGenericError();
> + error.SetErrorString(bad_value_error);
> + return false;
> + }
> + frame.AssignValue(inst, result, module);
> +
> + if (log)
> + {
> + log->Printf("Interpreted a %s",
> inst->getOpcodeName());
> + log->Printf(" Incoming value : %s",
> frame.SummarizeValue(value).c_str());
> + }
> + }
> + break;
> case Instruction::GetElementPtr:
> {
> const GetElementPtrInst *gep_inst =
> dyn_cast<GetElementPtrInst>(inst);
>
>
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20160414/3e54f159/attachment-0001.html>
More information about the lldb-commits
mailing list