diff options
author | Sean Callanan <scallanan@apple.com> | 2010-07-13 21:41:46 +0000 |
---|---|---|
committer | Sean Callanan <scallanan@apple.com> | 2010-07-13 21:41:46 +0000 |
commit | 549c9f7f9a4b0951c17a837f08e01f5c36512b54 (patch) | |
tree | aba30ec942523154830bb7b2edd5228f108c8ded /lldb/source/Expression/ClangExpressionDeclMap.cpp | |
parent | 50bcf13a7b5339991297eed7493cb383fa115386 (diff) | |
download | bcm5719-llvm-549c9f7f9a4b0951c17a837f08e01f5c36512b54.tar.gz bcm5719-llvm-549c9f7f9a4b0951c17a837f08e01f5c36512b54.zip |
"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.
llvm-svn: 108279
Diffstat (limited to 'lldb/source/Expression/ClangExpressionDeclMap.cpp')
-rw-r--r-- | lldb/source/Expression/ClangExpressionDeclMap.cpp | 102 |
1 files changed, 101 insertions, 1 deletions
diff --git a/lldb/source/Expression/ClangExpressionDeclMap.cpp b/lldb/source/Expression/ClangExpressionDeclMap.cpp index d78f84075db..b83cf4a330e 100644 --- a/lldb/source/Expression/ClangExpressionDeclMap.cpp +++ b/lldb/source/Expression/ClangExpressionDeclMap.cpp @@ -38,7 +38,8 @@ using namespace lldb_private; 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 @@ ClangExpressionDeclMap::GetIndexForDecl (uint32_t &index, 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) |