ClangUserExpression.cpp revision e8a59a8ec92e71203e434f28b5bac6606aacaf3c
165dafa8344c8c018e346dd331a7782081a896239Sean Callanan//===-- ClangUserExpression.cpp -------------------------------------*- C++ -*-===// 265dafa8344c8c018e346dd331a7782081a896239Sean Callanan// 365dafa8344c8c018e346dd331a7782081a896239Sean Callanan// The LLVM Compiler Infrastructure 465dafa8344c8c018e346dd331a7782081a896239Sean Callanan// 565dafa8344c8c018e346dd331a7782081a896239Sean Callanan// This file is distributed under the University of Illinois Open Source 665dafa8344c8c018e346dd331a7782081a896239Sean Callanan// License. See LICENSE.TXT for details. 765dafa8344c8c018e346dd331a7782081a896239Sean Callanan// 865dafa8344c8c018e346dd331a7782081a896239Sean Callanan//===----------------------------------------------------------------------===// 965dafa8344c8c018e346dd331a7782081a896239Sean Callanan 1065dafa8344c8c018e346dd331a7782081a896239Sean Callanan// C Includes 1165dafa8344c8c018e346dd331a7782081a896239Sean Callanan#include <stdio.h> 1265dafa8344c8c018e346dd331a7782081a896239Sean Callanan#if HAVE_SYS_TYPES_H 1365dafa8344c8c018e346dd331a7782081a896239Sean Callanan# include <sys/types.h> 1465dafa8344c8c018e346dd331a7782081a896239Sean Callanan#endif 1565dafa8344c8c018e346dd331a7782081a896239Sean Callanan 1665dafa8344c8c018e346dd331a7782081a896239Sean Callanan// C++ Includes 1765dafa8344c8c018e346dd331a7782081a896239Sean Callanan#include <cstdlib> 1865dafa8344c8c018e346dd331a7782081a896239Sean Callanan#include <string> 1965dafa8344c8c018e346dd331a7782081a896239Sean Callanan#include <map> 2065dafa8344c8c018e346dd331a7782081a896239Sean Callanan 2165dafa8344c8c018e346dd331a7782081a896239Sean Callanan#include "lldb/Core/ConstString.h" 2265dafa8344c8c018e346dd331a7782081a896239Sean Callanan#include "lldb/Core/Log.h" 2365dafa8344c8c018e346dd331a7782081a896239Sean Callanan#include "lldb/Core/StreamString.h" 2465dafa8344c8c018e346dd331a7782081a896239Sean Callanan#include "lldb/Expression/ClangExpressionDeclMap.h" 2565dafa8344c8c018e346dd331a7782081a896239Sean Callanan#include "lldb/Expression/ClangExpressionParser.h" 2665dafa8344c8c018e346dd331a7782081a896239Sean Callanan#include "lldb/Expression/ClangFunction.h" 2765dafa8344c8c018e346dd331a7782081a896239Sean Callanan#include "lldb/Expression/ASTResultSynthesizer.h" 2865dafa8344c8c018e346dd331a7782081a896239Sean Callanan#include "lldb/Expression/ClangUserExpression.h" 2965dafa8344c8c018e346dd331a7782081a896239Sean Callanan#include "lldb/Host/Host.h" 3065dafa8344c8c018e346dd331a7782081a896239Sean Callanan#include "lldb/Target/ExecutionContext.h" 3165dafa8344c8c018e346dd331a7782081a896239Sean Callanan#include "lldb/Target/Target.h" 3265dafa8344c8c018e346dd331a7782081a896239Sean Callanan 3365dafa8344c8c018e346dd331a7782081a896239Sean Callananusing namespace lldb_private; 3465dafa8344c8c018e346dd331a7782081a896239Sean Callanan 3565dafa8344c8c018e346dd331a7782081a896239Sean CallananClangUserExpression::ClangUserExpression (const char *expr) : 3665dafa8344c8c018e346dd331a7782081a896239Sean Callanan m_expr_text(expr), 3765dafa8344c8c018e346dd331a7782081a896239Sean Callanan m_jit_addr(LLDB_INVALID_ADDRESS) 3865dafa8344c8c018e346dd331a7782081a896239Sean Callanan{ 3965dafa8344c8c018e346dd331a7782081a896239Sean Callanan StreamString m_transformed_stream; 4065dafa8344c8c018e346dd331a7782081a896239Sean Callanan 4165dafa8344c8c018e346dd331a7782081a896239Sean Callanan m_transformed_stream.Printf("extern \"C\" void %s(void *___clang_arg) { %s; }\n", 4265dafa8344c8c018e346dd331a7782081a896239Sean Callanan FunctionName(), 4365dafa8344c8c018e346dd331a7782081a896239Sean Callanan m_expr_text.c_str()); 4465dafa8344c8c018e346dd331a7782081a896239Sean Callanan 4565dafa8344c8c018e346dd331a7782081a896239Sean Callanan m_transformed_text = m_transformed_stream.GetData(); 4665dafa8344c8c018e346dd331a7782081a896239Sean Callanan} 4765dafa8344c8c018e346dd331a7782081a896239Sean Callanan 48830a903fd7cd4595cf52e1630b6491930ada0400Sean CallananClangUserExpression::~ClangUserExpression () 49830a903fd7cd4595cf52e1630b6491930ada0400Sean Callanan{ 50830a903fd7cd4595cf52e1630b6491930ada0400Sean Callanan} 51830a903fd7cd4595cf52e1630b6491930ada0400Sean Callanan 5265dafa8344c8c018e346dd331a7782081a896239Sean Callananclang::ASTConsumer * 5365dafa8344c8c018e346dd331a7782081a896239Sean CallananClangUserExpression::ASTTransformer (clang::ASTConsumer *passthrough) 5465dafa8344c8c018e346dd331a7782081a896239Sean Callanan{ 5565dafa8344c8c018e346dd331a7782081a896239Sean Callanan return new ASTResultSynthesizer(passthrough); 5665dafa8344c8c018e346dd331a7782081a896239Sean Callanan} 5765dafa8344c8c018e346dd331a7782081a896239Sean Callanan 5865dafa8344c8c018e346dd331a7782081a896239Sean Callananbool 5965dafa8344c8c018e346dd331a7782081a896239Sean CallananClangUserExpression::Parse (Stream &error_stream, ExecutionContext &exe_ctx) 6065dafa8344c8c018e346dd331a7782081a896239Sean Callanan{ 6165dafa8344c8c018e346dd331a7782081a896239Sean Callanan Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 6265dafa8344c8c018e346dd331a7782081a896239Sean Callanan 6365dafa8344c8c018e346dd331a7782081a896239Sean Callanan //////////////////////////////////// 6465dafa8344c8c018e346dd331a7782081a896239Sean Callanan // Set up the target and compiler 6565dafa8344c8c018e346dd331a7782081a896239Sean Callanan // 6665dafa8344c8c018e346dd331a7782081a896239Sean Callanan 6765dafa8344c8c018e346dd331a7782081a896239Sean Callanan Target *target = exe_ctx.target; 6865dafa8344c8c018e346dd331a7782081a896239Sean Callanan 6965dafa8344c8c018e346dd331a7782081a896239Sean Callanan if (!target) 7065dafa8344c8c018e346dd331a7782081a896239Sean Callanan { 7165dafa8344c8c018e346dd331a7782081a896239Sean Callanan error_stream.PutCString ("error: invalid target\n"); 7265dafa8344c8c018e346dd331a7782081a896239Sean Callanan return false; 7365dafa8344c8c018e346dd331a7782081a896239Sean Callanan } 7465dafa8344c8c018e346dd331a7782081a896239Sean Callanan 7565dafa8344c8c018e346dd331a7782081a896239Sean Callanan ConstString target_triple; 7665dafa8344c8c018e346dd331a7782081a896239Sean Callanan 7765dafa8344c8c018e346dd331a7782081a896239Sean Callanan target->GetTargetTriple (target_triple); 7865dafa8344c8c018e346dd331a7782081a896239Sean Callanan 7965dafa8344c8c018e346dd331a7782081a896239Sean Callanan if (!target_triple) 8065dafa8344c8c018e346dd331a7782081a896239Sean Callanan target_triple = Host::GetTargetTriple (); 8165dafa8344c8c018e346dd331a7782081a896239Sean Callanan 8265dafa8344c8c018e346dd331a7782081a896239Sean Callanan if (!target_triple) 8365dafa8344c8c018e346dd331a7782081a896239Sean Callanan { 8465dafa8344c8c018e346dd331a7782081a896239Sean Callanan error_stream.PutCString ("error: invalid target triple\n"); 8565dafa8344c8c018e346dd331a7782081a896239Sean Callanan return false; 8665dafa8344c8c018e346dd331a7782081a896239Sean Callanan } 8765dafa8344c8c018e346dd331a7782081a896239Sean Callanan 8865dafa8344c8c018e346dd331a7782081a896239Sean Callanan ////////////////////////// 8965dafa8344c8c018e346dd331a7782081a896239Sean Callanan // Parse the expression 9065dafa8344c8c018e346dd331a7782081a896239Sean Callanan // 9165dafa8344c8c018e346dd331a7782081a896239Sean Callanan 9265dafa8344c8c018e346dd331a7782081a896239Sean Callanan m_expr_decl_map.reset(new ClangExpressionDeclMap(&exe_ctx)); 9365dafa8344c8c018e346dd331a7782081a896239Sean Callanan 9465dafa8344c8c018e346dd331a7782081a896239Sean Callanan ClangExpressionParser parser(target_triple.GetCString(), *this); 9565dafa8344c8c018e346dd331a7782081a896239Sean Callanan 9665dafa8344c8c018e346dd331a7782081a896239Sean Callanan unsigned num_errors = parser.Parse (error_stream); 9765dafa8344c8c018e346dd331a7782081a896239Sean Callanan 9865dafa8344c8c018e346dd331a7782081a896239Sean Callanan if (num_errors) 9965dafa8344c8c018e346dd331a7782081a896239Sean Callanan { 10065dafa8344c8c018e346dd331a7782081a896239Sean Callanan error_stream.Printf ("error: %d errors parsing expression\n", num_errors); 10165dafa8344c8c018e346dd331a7782081a896239Sean Callanan return false; 10265dafa8344c8c018e346dd331a7782081a896239Sean Callanan } 10365dafa8344c8c018e346dd331a7782081a896239Sean Callanan 10465dafa8344c8c018e346dd331a7782081a896239Sean Callanan /////////////////////////////////////////////// 10565dafa8344c8c018e346dd331a7782081a896239Sean Callanan // Convert the output of the parser to DWARF 10665dafa8344c8c018e346dd331a7782081a896239Sean Callanan // 10765dafa8344c8c018e346dd331a7782081a896239Sean Callanan 10865dafa8344c8c018e346dd331a7782081a896239Sean Callanan m_dwarf_opcodes.reset(new StreamString); 10965dafa8344c8c018e346dd331a7782081a896239Sean Callanan m_dwarf_opcodes->SetByteOrder (lldb::eByteOrderHost); 11065dafa8344c8c018e346dd331a7782081a896239Sean Callanan m_dwarf_opcodes->GetFlags ().Set (Stream::eBinary); 11165dafa8344c8c018e346dd331a7782081a896239Sean Callanan 11265dafa8344c8c018e346dd331a7782081a896239Sean Callanan m_local_variables.reset(new ClangExpressionVariableStore()); 11365dafa8344c8c018e346dd331a7782081a896239Sean Callanan 11465dafa8344c8c018e346dd331a7782081a896239Sean Callanan Error dwarf_error = parser.MakeDWARF (); 11565dafa8344c8c018e346dd331a7782081a896239Sean Callanan 11665dafa8344c8c018e346dd331a7782081a896239Sean Callanan if (dwarf_error.Success()) 11765dafa8344c8c018e346dd331a7782081a896239Sean Callanan { 11865dafa8344c8c018e346dd331a7782081a896239Sean Callanan if (log) 11965dafa8344c8c018e346dd331a7782081a896239Sean Callanan log->Printf("Code can be interpreted."); 12065dafa8344c8c018e346dd331a7782081a896239Sean Callanan 12165dafa8344c8c018e346dd331a7782081a896239Sean Callanan return true; 12265dafa8344c8c018e346dd331a7782081a896239Sean Callanan } 12365dafa8344c8c018e346dd331a7782081a896239Sean Callanan 12465dafa8344c8c018e346dd331a7782081a896239Sean Callanan ////////////////////////////////// 12565dafa8344c8c018e346dd331a7782081a896239Sean Callanan // JIT the output of the parser 12665dafa8344c8c018e346dd331a7782081a896239Sean Callanan // 12765dafa8344c8c018e346dd331a7782081a896239Sean Callanan 12865dafa8344c8c018e346dd331a7782081a896239Sean Callanan m_dwarf_opcodes.reset(); 12965dafa8344c8c018e346dd331a7782081a896239Sean Callanan 130830a903fd7cd4595cf52e1630b6491930ada0400Sean Callanan lldb::addr_t jit_end; 131830a903fd7cd4595cf52e1630b6491930ada0400Sean Callanan 132830a903fd7cd4595cf52e1630b6491930ada0400Sean Callanan Error jit_error = parser.MakeJIT (m_jit_addr, jit_end, exe_ctx); 13365dafa8344c8c018e346dd331a7782081a896239Sean Callanan 13465dafa8344c8c018e346dd331a7782081a896239Sean Callanan if (jit_error.Success()) 13565dafa8344c8c018e346dd331a7782081a896239Sean Callanan { 13665dafa8344c8c018e346dd331a7782081a896239Sean Callanan if (log) 13765dafa8344c8c018e346dd331a7782081a896239Sean Callanan { 13865dafa8344c8c018e346dd331a7782081a896239Sean Callanan log->Printf("Code can be run in the target."); 13965dafa8344c8c018e346dd331a7782081a896239Sean Callanan 14065dafa8344c8c018e346dd331a7782081a896239Sean Callanan StreamString disassembly_stream; 14165dafa8344c8c018e346dd331a7782081a896239Sean Callanan 14265dafa8344c8c018e346dd331a7782081a896239Sean Callanan Error err = parser.DisassembleFunction(disassembly_stream, exe_ctx); 14365dafa8344c8c018e346dd331a7782081a896239Sean Callanan 14465dafa8344c8c018e346dd331a7782081a896239Sean Callanan if (!err.Success()) 14565dafa8344c8c018e346dd331a7782081a896239Sean Callanan { 14665dafa8344c8c018e346dd331a7782081a896239Sean Callanan log->Printf("Couldn't disassemble function : %s", err.AsCString("unknown error")); 14765dafa8344c8c018e346dd331a7782081a896239Sean Callanan } 14865dafa8344c8c018e346dd331a7782081a896239Sean Callanan else 14965dafa8344c8c018e346dd331a7782081a896239Sean Callanan { 15065dafa8344c8c018e346dd331a7782081a896239Sean Callanan log->Printf("Function disassembly:\n%s", disassembly_stream.GetData()); 15165dafa8344c8c018e346dd331a7782081a896239Sean Callanan } 15265dafa8344c8c018e346dd331a7782081a896239Sean Callanan } 15365dafa8344c8c018e346dd331a7782081a896239Sean Callanan 15465dafa8344c8c018e346dd331a7782081a896239Sean Callanan return true; 15565dafa8344c8c018e346dd331a7782081a896239Sean Callanan } 15665dafa8344c8c018e346dd331a7782081a896239Sean Callanan else 15765dafa8344c8c018e346dd331a7782081a896239Sean Callanan { 15865dafa8344c8c018e346dd331a7782081a896239Sean Callanan error_stream.Printf ("error: expression can't be interpreted or run\n", num_errors); 15965dafa8344c8c018e346dd331a7782081a896239Sean Callanan return false; 16065dafa8344c8c018e346dd331a7782081a896239Sean Callanan } 16165dafa8344c8c018e346dd331a7782081a896239Sean Callanan} 16265dafa8344c8c018e346dd331a7782081a896239Sean Callanan 16365dafa8344c8c018e346dd331a7782081a896239Sean Callananbool 16465dafa8344c8c018e346dd331a7782081a896239Sean CallananClangUserExpression::Execute (Stream &error_stream, 16565dafa8344c8c018e346dd331a7782081a896239Sean Callanan ExecutionContext &exe_ctx, 16665dafa8344c8c018e346dd331a7782081a896239Sean Callanan ClangExpressionVariable *&result) 16765dafa8344c8c018e346dd331a7782081a896239Sean Callanan{ 16865dafa8344c8c018e346dd331a7782081a896239Sean Callanan Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 16965dafa8344c8c018e346dd331a7782081a896239Sean Callanan 17065dafa8344c8c018e346dd331a7782081a896239Sean Callanan if (m_dwarf_opcodes.get()) 17165dafa8344c8c018e346dd331a7782081a896239Sean Callanan { 17265dafa8344c8c018e346dd331a7782081a896239Sean Callanan // TODO execute the JITted opcodes 17365dafa8344c8c018e346dd331a7782081a896239Sean Callanan 17465dafa8344c8c018e346dd331a7782081a896239Sean Callanan error_stream.Printf("We don't currently support executing DWARF expressions"); 17565dafa8344c8c018e346dd331a7782081a896239Sean Callanan 17665dafa8344c8c018e346dd331a7782081a896239Sean Callanan return false; 17765dafa8344c8c018e346dd331a7782081a896239Sean Callanan } 17865dafa8344c8c018e346dd331a7782081a896239Sean Callanan else if (m_jit_addr != LLDB_INVALID_ADDRESS) 17965dafa8344c8c018e346dd331a7782081a896239Sean Callanan { 18065dafa8344c8c018e346dd331a7782081a896239Sean Callanan lldb::addr_t struct_address; 18165dafa8344c8c018e346dd331a7782081a896239Sean Callanan 18265dafa8344c8c018e346dd331a7782081a896239Sean Callanan Error materialize_error; 18365dafa8344c8c018e346dd331a7782081a896239Sean Callanan 18465dafa8344c8c018e346dd331a7782081a896239Sean Callanan if (!m_expr_decl_map->Materialize(&exe_ctx, struct_address, materialize_error)) 18565dafa8344c8c018e346dd331a7782081a896239Sean Callanan { 18665dafa8344c8c018e346dd331a7782081a896239Sean Callanan error_stream.Printf("Couldn't materialize struct: %s\n", materialize_error.AsCString("unknown error")); 18765dafa8344c8c018e346dd331a7782081a896239Sean Callanan return false; 18865dafa8344c8c018e346dd331a7782081a896239Sean Callanan } 18965dafa8344c8c018e346dd331a7782081a896239Sean Callanan 19065dafa8344c8c018e346dd331a7782081a896239Sean Callanan if (log) 19165dafa8344c8c018e346dd331a7782081a896239Sean Callanan { 19265dafa8344c8c018e346dd331a7782081a896239Sean Callanan log->Printf("Function address : 0x%llx", (uint64_t)m_jit_addr); 19365dafa8344c8c018e346dd331a7782081a896239Sean Callanan log->Printf("Structure address : 0x%llx", (uint64_t)struct_address); 19465dafa8344c8c018e346dd331a7782081a896239Sean Callanan 19565dafa8344c8c018e346dd331a7782081a896239Sean Callanan StreamString args; 19665dafa8344c8c018e346dd331a7782081a896239Sean Callanan 19765dafa8344c8c018e346dd331a7782081a896239Sean Callanan Error dump_error; 19865dafa8344c8c018e346dd331a7782081a896239Sean Callanan 199e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan if (struct_address) 20065dafa8344c8c018e346dd331a7782081a896239Sean Callanan { 201e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan if (!m_expr_decl_map->DumpMaterializedStruct(&exe_ctx, args, dump_error)) 202e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan { 203e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan log->Printf("Couldn't extract variable values : %s", dump_error.AsCString("unknown error")); 204e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan } 205e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan else 206e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan { 207e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan log->Printf("Structure contents:\n%s", args.GetData()); 208e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan } 20965dafa8344c8c018e346dd331a7782081a896239Sean Callanan } 21065dafa8344c8c018e346dd331a7782081a896239Sean Callanan } 21165dafa8344c8c018e346dd331a7782081a896239Sean Callanan 21265dafa8344c8c018e346dd331a7782081a896239Sean Callanan ClangFunction::ExecutionResults execution_result = 21365dafa8344c8c018e346dd331a7782081a896239Sean Callanan ClangFunction::ExecuteFunction (exe_ctx, m_jit_addr, struct_address, true, true, 10000, error_stream); 21465dafa8344c8c018e346dd331a7782081a896239Sean Callanan 21565dafa8344c8c018e346dd331a7782081a896239Sean Callanan if (execution_result != ClangFunction::eExecutionCompleted) 21665dafa8344c8c018e346dd331a7782081a896239Sean Callanan { 21765dafa8344c8c018e346dd331a7782081a896239Sean Callanan const char *result_name; 21865dafa8344c8c018e346dd331a7782081a896239Sean Callanan 21965dafa8344c8c018e346dd331a7782081a896239Sean Callanan switch (execution_result) 22065dafa8344c8c018e346dd331a7782081a896239Sean Callanan { 22165dafa8344c8c018e346dd331a7782081a896239Sean Callanan case ClangFunction::eExecutionCompleted: 22265dafa8344c8c018e346dd331a7782081a896239Sean Callanan result_name = "eExecutionCompleted"; 22365dafa8344c8c018e346dd331a7782081a896239Sean Callanan break; 22465dafa8344c8c018e346dd331a7782081a896239Sean Callanan case ClangFunction::eExecutionDiscarded: 22565dafa8344c8c018e346dd331a7782081a896239Sean Callanan result_name = "eExecutionDiscarded"; 22665dafa8344c8c018e346dd331a7782081a896239Sean Callanan break; 22765dafa8344c8c018e346dd331a7782081a896239Sean Callanan case ClangFunction::eExecutionInterrupted: 22865dafa8344c8c018e346dd331a7782081a896239Sean Callanan result_name = "eExecutionInterrupted"; 22965dafa8344c8c018e346dd331a7782081a896239Sean Callanan break; 23065dafa8344c8c018e346dd331a7782081a896239Sean Callanan case ClangFunction::eExecutionSetupError: 23165dafa8344c8c018e346dd331a7782081a896239Sean Callanan result_name = "eExecutionSetupError"; 23265dafa8344c8c018e346dd331a7782081a896239Sean Callanan break; 23365dafa8344c8c018e346dd331a7782081a896239Sean Callanan case ClangFunction::eExecutionTimedOut: 23465dafa8344c8c018e346dd331a7782081a896239Sean Callanan result_name = "eExecutionTimedOut"; 23565dafa8344c8c018e346dd331a7782081a896239Sean Callanan break; 23665dafa8344c8c018e346dd331a7782081a896239Sean Callanan } 23765dafa8344c8c018e346dd331a7782081a896239Sean Callanan 23865dafa8344c8c018e346dd331a7782081a896239Sean Callanan error_stream.Printf ("Couldn't execute function; result was %s\n", result_name); 23965dafa8344c8c018e346dd331a7782081a896239Sean Callanan return false; 24065dafa8344c8c018e346dd331a7782081a896239Sean Callanan } 24165dafa8344c8c018e346dd331a7782081a896239Sean Callanan 24265dafa8344c8c018e346dd331a7782081a896239Sean Callanan Error expr_error; 24365dafa8344c8c018e346dd331a7782081a896239Sean Callanan 24465dafa8344c8c018e346dd331a7782081a896239Sean Callanan if (!m_expr_decl_map->Dematerialize(&exe_ctx, result, expr_error)) 24565dafa8344c8c018e346dd331a7782081a896239Sean Callanan { 24665dafa8344c8c018e346dd331a7782081a896239Sean Callanan error_stream.Printf ("Couldn't dematerialize struct : %s\n", expr_error.AsCString("unknown error")); 24765dafa8344c8c018e346dd331a7782081a896239Sean Callanan return false; 24865dafa8344c8c018e346dd331a7782081a896239Sean Callanan } 24965dafa8344c8c018e346dd331a7782081a896239Sean Callanan 25065dafa8344c8c018e346dd331a7782081a896239Sean Callanan return true; 25165dafa8344c8c018e346dd331a7782081a896239Sean Callanan } 25265dafa8344c8c018e346dd331a7782081a896239Sean Callanan else 25365dafa8344c8c018e346dd331a7782081a896239Sean Callanan { 25465dafa8344c8c018e346dd331a7782081a896239Sean Callanan error_stream.Printf("Expression can't be run; neither DWARF nor a JIT compiled function are present"); 25565dafa8344c8c018e346dd331a7782081a896239Sean Callanan return false; 25665dafa8344c8c018e346dd331a7782081a896239Sean Callanan } 25765dafa8344c8c018e346dd331a7782081a896239Sean Callanan} 25865dafa8344c8c018e346dd331a7782081a896239Sean Callanan 25965dafa8344c8c018e346dd331a7782081a896239Sean CallananStreamString & 26065dafa8344c8c018e346dd331a7782081a896239Sean CallananClangUserExpression::DwarfOpcodeStream () 26165dafa8344c8c018e346dd331a7782081a896239Sean Callanan{ 26265dafa8344c8c018e346dd331a7782081a896239Sean Callanan if (!m_dwarf_opcodes.get()) 26365dafa8344c8c018e346dd331a7782081a896239Sean Callanan m_dwarf_opcodes.reset(new StreamString()); 26465dafa8344c8c018e346dd331a7782081a896239Sean Callanan 26565dafa8344c8c018e346dd331a7782081a896239Sean Callanan return *m_dwarf_opcodes.get(); 26665dafa8344c8c018e346dd331a7782081a896239Sean Callanan} 267