"expr -i" now performs the required transforms to
prepare the IR for JIT compilation. We still need
to do the JIT compilation and move the arguments
in/out of target memory.
git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@108279 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Expression/ClangExpressionDeclMap.cpp b/source/Expression/ClangExpressionDeclMap.cpp
index d78f840..b83cf4a 100644
--- a/source/Expression/ClangExpressionDeclMap.cpp
+++ b/source/Expression/ClangExpressionDeclMap.cpp
@@ -38,7 +38,8 @@
using namespace clang;
ClangExpressionDeclMap::ClangExpressionDeclMap(ExecutionContext *exe_ctx) :
- m_exe_ctx(exe_ctx)
+ m_exe_ctx(exe_ctx),
+ m_struct_laid_out(false)
{
if (exe_ctx && exe_ctx->frame)
m_sym_ctx = new SymbolContext(exe_ctx->frame->GetSymbolContext(lldb::eSymbolContextEverything));
@@ -77,6 +78,105 @@
return false;
}
+// Interface for IRForTarget
+
+bool
+ClangExpressionDeclMap::AddValueToStruct (llvm::Value *value,
+ const clang::NamedDecl *decl,
+ size_t size,
+ off_t alignment)
+{
+ m_struct_laid_out = false;
+
+ StructMemberIterator iter;
+
+ for (iter = m_members.begin();
+ iter != m_members.end();
+ ++iter)
+ {
+ if (iter->m_decl == decl)
+ return true;
+ }
+
+ StructMember member;
+
+ member.m_value = value;
+ member.m_decl = decl;
+ member.m_offset = 0;
+ member.m_size = size;
+ member.m_alignment = alignment;
+
+ m_members.push_back(member);
+
+ return true;
+}
+
+bool
+ClangExpressionDeclMap::DoStructLayout ()
+{
+ if (m_struct_laid_out)
+ return true;
+
+ StructMemberIterator iter;
+
+ off_t cursor = 0;
+
+ m_struct_alignment = 0;
+ m_struct_size = 0;
+
+ for (iter = m_members.begin();
+ iter != m_members.end();
+ ++iter)
+ {
+ if (iter == m_members.begin())
+ m_struct_alignment = iter->m_alignment;
+
+ if (cursor % iter->m_alignment)
+ cursor += (iter->m_alignment - (cursor % iter->m_alignment));
+
+ iter->m_offset = cursor;
+ cursor += iter->m_size;
+ }
+
+ m_struct_size = cursor;
+
+ m_struct_laid_out = true;
+ return true;
+}
+
+bool ClangExpressionDeclMap::GetStructInfo (uint32_t &num_elements,
+ size_t &size,
+ off_t &alignment)
+{
+ if (!m_struct_laid_out)
+ return false;
+
+ num_elements = m_members.size();
+ size = m_struct_size;
+ alignment = m_struct_alignment;
+
+ return true;
+}
+
+bool
+ClangExpressionDeclMap::GetStructElement (const clang::NamedDecl *&decl,
+ llvm::Value *&value,
+ off_t &offset,
+ uint32_t index)
+{
+ if (!m_struct_laid_out)
+ return false;
+
+ if (index >= m_members.size())
+ return false;
+
+ decl = m_members[index].m_decl;
+ value = m_members[index].m_value;
+ offset = m_members[index].m_offset;
+
+ return true;
+}
+
// Interface for DwarfExpression
Value
*ClangExpressionDeclMap::GetValueForIndex (uint32_t index)