diff options
author | Sean Callanan <scallanan@apple.com> | 2010-06-23 23:18:04 +0000 |
---|---|---|
committer | Sean Callanan <scallanan@apple.com> | 2010-06-23 23:18:04 +0000 |
commit | 1d389c4b024416ef843bcebf6309dd0c377aafd8 (patch) | |
tree | 5619cc22835c5d23acc08764d13caf5b6852ef1c | |
parent | f470747a365a5edac817c27359e020fa006b7d69 (diff) | |
download | bcm5719-llvm-1d389c4b024416ef843bcebf6309dd0c377aafd8.tar.gz bcm5719-llvm-1d389c4b024416ef843bcebf6309dd0c377aafd8.zip |
Added the temporary -i option to expr, which
switches the expression parsing over to use the
LLVM IR as opposed to Clang ASTs. Right now,
that functionality only logs.
llvm-svn: 106695
-rw-r--r-- | lldb/include/lldb/Expression/ClangExpression.h | 4 | ||||
-rw-r--r-- | lldb/source/Commands/CommandObjectExpression.cpp | 39 | ||||
-rw-r--r-- | lldb/source/Commands/CommandObjectExpression.h | 1 | ||||
-rw-r--r-- | lldb/source/Expression/ClangExpression.cpp | 55 |
4 files changed, 90 insertions, 9 deletions
diff --git a/lldb/include/lldb/Expression/ClangExpression.h b/lldb/include/lldb/Expression/ClangExpression.h index d961d5c874b..660ece1ac90 100644 --- a/lldb/include/lldb/Expression/ClangExpression.h +++ b/lldb/include/lldb/Expression/ClangExpression.h @@ -57,6 +57,10 @@ public: unsigned ConvertExpressionToDWARF (ClangExpressionVariableList &expr_local_variable_list, StreamString &dwarf_opcode_strm); + + unsigned + ConvertIRToDWARF (ClangExpressionVariableList &excpr_local_variable_list, + StreamString &dwarf_opcode_strm); bool JITFunction (const ExecutionContext &exc_context, const char *func_name); diff --git a/lldb/source/Commands/CommandObjectExpression.cpp b/lldb/source/Commands/CommandObjectExpression.cpp index 38534f03730..e60ae2b3a91 100644 --- a/lldb/source/Commands/CommandObjectExpression.cpp +++ b/lldb/source/Commands/CommandObjectExpression.cpp @@ -69,6 +69,10 @@ CommandObjectExpression::CommandOptions::SetOptionValue (int option_idx, const c case 'f': error = Args::StringToFormat(option_arg, format); break; + + case 'i': + use_ir = true; + break; default: error.SetErrorStringWithFormat("Invalid short option character '%c'.\n", short_option); @@ -87,6 +91,7 @@ CommandObjectExpression::CommandOptions::ResetOptionValues () format = eFormatDefault; show_types = true; show_summary = true; + use_ir = false; } const lldb::OptionDefinition* @@ -198,7 +203,6 @@ CommandObjectExpression::EvaluateExpression (const char *expr, bool bare, Stream if (!target_triple) target_triple = Host::GetTargetTriple (); - if (target_triple) { const bool show_types = m_options.show_types; @@ -221,9 +225,19 @@ CommandObjectExpression::EvaluateExpression (const char *expr, bool bare, Stream dwarf_opcodes.SetByteOrder(eByteOrderHost); dwarf_opcodes.GetFlags().Set(Stream::eBinary); ClangExpressionVariableList expr_local_vars; - clang_expr.ConvertExpressionToDWARF (expr_local_vars, dwarf_opcodes); - - success = true; + + bool success; + + if (m_options.use_ir) + success = (clang_expr.ConvertIRToDWARF (expr_local_vars, dwarf_opcodes) == 0); + else + success = (clang_expr.ConvertExpressionToDWARF (expr_local_vars, dwarf_opcodes) == 0); + + if (!success) + { + output_stream << "Expression couldn't be translated to DWARF\n"; + return false; + } DataExtractor dwarf_opcodes_data(dwarf_opcodes.GetData(), dwarf_opcodes.GetSize(), eByteOrderHost, 8); DWARFExpression expr(dwarf_opcodes_data, 0, dwarf_opcodes_data.GetByteSize(), NULL); @@ -431,7 +445,14 @@ CommandObjectExpression::ExecuteRawCommandString dwarf_opcodes.SetByteOrder(eByteOrderHost); dwarf_opcodes.GetFlags().Set(Stream::eBinary); ClangExpressionVariableList expr_local_vars; - clang_expr.ConvertExpressionToDWARF (expr_local_vars, dwarf_opcodes); + + bool success = true; + + if (m_options.use_ir) + success = (clang_expr.ConvertIRToDWARF (expr_local_vars, dwarf_opcodes) == 0); + else + success = (clang_expr.ConvertExpressionToDWARF (expr_local_vars, dwarf_opcodes) == 0); + result.SetStatus (eReturnStatusSuccessFinishResult); @@ -439,6 +460,7 @@ CommandObjectExpression::ExecuteRawCommandString DWARFExpression expr(dwarf_opcodes_data, 0, dwarf_opcodes_data.GetByteSize(), NULL); expr.SetExpressionLocalVariableList(&expr_local_vars); expr.SetExpressionDeclMap(&expr_decl_map); + if (debug) { output_stream << "Expression parsed ok, dwarf opcodes:"; @@ -541,9 +563,10 @@ CommandObjectExpression::ExecuteRawCommandString lldb::OptionDefinition CommandObjectExpression::CommandOptions::g_option_table[] = { -{ LLDB_OPT_SET_1, true, "language", 'l', required_argument, NULL, 0, "[c|c++|objc|objc++]", "Sets the language to use when parsing the expression."}, -{ LLDB_OPT_SET_2, false, "format", 'f', required_argument, NULL, 0, "[ [bool|b] | [bin] | [char|c] | [oct|o] | [dec|i|d|u] | [hex|x] | [float|f] | [cstr|s] ]", "Specify the format that the expression output should use."}, -{ LLDB_OPT_SET_3, false, "debug", 'g', no_argument, NULL, 0, NULL, "Enable verbose debug logging of the expression parsing and evaluation."}, +{ LLDB_OPT_SET_ALL, true, "language", 'l', required_argument, NULL, 0, "[c|c++|objc|objc++]", "Sets the language to use when parsing the expression."}, +{ LLDB_OPT_SET_ALL, false, "format", 'f', required_argument, NULL, 0, "[ [bool|b] | [bin] | [char|c] | [oct|o] | [dec|i|d|u] | [hex|x] | [float|f] | [cstr|s] ]", "Specify the format that the expression output should use."}, +{ LLDB_OPT_SET_ALL, false, "debug", 'g', no_argument, NULL, 0, NULL, "Enable verbose debug logging of the expression parsing and evaluation."}, +{ LLDB_OPT_SET_ALL, false, "use-ir", 'i', no_argument, NULL, 0, NULL, "[Temporary] Instructs the expression evaluator to use IR instead of ASTs."}, { 0, false, NULL, 0, 0, NULL, NULL, NULL, NULL } }; diff --git a/lldb/source/Commands/CommandObjectExpression.h b/lldb/source/Commands/CommandObjectExpression.h index 1959ecbc1e8..79a1c4f3501 100644 --- a/lldb/source/Commands/CommandObjectExpression.h +++ b/lldb/source/Commands/CommandObjectExpression.h @@ -52,6 +52,7 @@ public: bool debug; bool show_types; bool show_summary; + bool use_ir; }; CommandObjectExpression (); diff --git a/lldb/source/Expression/ClangExpression.cpp b/lldb/source/Expression/ClangExpression.cpp index 626418b7ea4..b5846356652 100644 --- a/lldb/source/Expression/ClangExpression.cpp +++ b/lldb/source/Expression/ClangExpression.cpp @@ -50,6 +50,7 @@ #include "llvm/Target/TargetSelect.h" // Project includes +#include "lldb/Core/Log.h" #include "lldb/Expression/ClangExpression.h" #include "lldb/Expression/ClangASTSource.h" #include "lldb/Expression/ClangStmtVisitor.h" @@ -354,7 +355,7 @@ ClangExpression::ParseBareExpression (llvm::StringRef expr_text, Stream &stream) // - Call clang::ParseAST (in lib/Sema/ParseAST.cpp) to parse the buffer. The CodeGenerator will generate code for __dbg_expr. // - Once ParseAST completes, you can grab the llvm::Module from the CodeGenerator, which will have an llvm::Function you can hand off to the JIT. ParseAST(m_clang_ap->getPreprocessor(), m_code_generator_ptr, m_clang_ap->getASTContext()); - + text_diagnostic_buffer.EndSourceFile(); //compiler_instance->getASTContext().getTranslationUnitDecl()->dump(); @@ -454,6 +455,58 @@ ClangExpression::ConvertExpressionToDWARF (ClangExpressionVariableList& expr_loc return 0; } +unsigned +ClangExpression::ConvertIRToDWARF (ClangExpressionVariableList &excpr_local_variable_list, + StreamString &dwarf_opcode_strm) +{ + Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); + + llvm::Module *module = m_code_generator_ptr->GetModule(); + + if (!module) + { + if (log) + log->Printf("IR doesn't contain a module"); + + return 1; + } + + llvm::Module::iterator fi; + + for (fi = module->begin(); + fi != module->end(); + ++fi) + { + llvm::Function &function = *fi; + + if (log) + log->Printf("IR for %s:", function.getName().str().c_str()); + + llvm::Function::iterator bbi; + + for (bbi = function.begin(); + bbi != function.end(); + ++bbi) + { + llvm::BasicBlock &bb = *bbi; + + llvm::BasicBlock::iterator ii; + + for (ii = bb.begin(); + ii != bb.end(); + ++ii) + { + llvm::Instruction &inst = *ii; + + if (log) + log->Printf(" %s", inst.getOpcodeName()); + } + } + } + + return 0; +} + bool ClangExpression::JITFunction (const ExecutionContext &exc_context, const char *name) { |