From 68f85e7d6af60500cb8765c0dc0eb4c8806e2c3e Mon Sep 17 00:00:00 2001 From: Sean Callanan Date: Thu, 30 Apr 2015 21:49:58 +0000 Subject: [PATCH] Made macros from modules be injected before our global convenience expression prefix. Also ensured that if macros are defined by the modules we don't try to redefine them. Finally cleaned up a bit of code while I was in there. llvm-svn: 236266 --- lldb/source/Expression/ClangUserExpression.cpp | 6 -- lldb/source/Expression/ExpressionSourceCode.cpp | 98 ++++++++++++++++--------- 2 files changed, 64 insertions(+), 40 deletions(-) diff --git a/lldb/source/Expression/ClangUserExpression.cpp b/lldb/source/Expression/ClangUserExpression.cpp index ba28431..ca2c03e 100644 --- a/lldb/source/Expression/ClangUserExpression.cpp +++ b/lldb/source/Expression/ClangUserExpression.cpp @@ -485,12 +485,6 @@ ClangUserExpression::Parse (Stream &error_stream, } } } - - decl_vendor->ForEachMacro(modules_for_macros, [log, &prefix] (const std::string &expansion) -> bool { - prefix.append(expansion); - prefix.append("\n"); - return false; - }); } std::unique_ptr source_code (ExpressionSourceCode::CreateWrapped(prefix.c_str(), m_expr_text.c_str())); diff --git a/lldb/source/Expression/ExpressionSourceCode.cpp b/lldb/source/Expression/ExpressionSourceCode.cpp index b3f335f..9a42510 100644 --- a/lldb/source/Expression/ExpressionSourceCode.cpp +++ b/lldb/source/Expression/ExpressionSourceCode.cpp @@ -10,24 +10,33 @@ #include "lldb/Expression/ExpressionSourceCode.h" #include "lldb/Core/StreamString.h" +#include "lldb/Expression/ClangModulesDeclVendor.h" +#include "lldb/Expression/ClangPersistentVariables.h" +#include "lldb/Symbol/Block.h" #include "lldb/Target/ExecutionContext.h" #include "lldb/Target/Platform.h" +#include "lldb/Target/StackFrame.h" #include "lldb/Target/Target.h" using namespace lldb_private; const char * ExpressionSourceCode::g_expression_prefix = R"( -#undef NULL -#undef Nil -#undef nil -#undef YES -#undef NO +#ifndef NULL #define NULL (__null) +#endif +#ifndef Nil #define Nil (__null) +#endif +#ifndef nil #define nil (__null) +#endif +#ifndef YES #define YES ((BOOL)1) +#endif +#ifndef NO #define NO ((BOOL)0) +#endif typedef __INT8_TYPE__ int8_t; typedef __UINT8_TYPE__ uint8_t; typedef __INT16_TYPE__ int16_t; @@ -51,7 +60,7 @@ extern "C" bool ExpressionSourceCode::GetText (std::string &text, lldb::LanguageType wrapping_language, bool const_object, bool static_method, ExecutionContext &exe_ctx) const { const char *target_specific_defines = "typedef signed char BOOL;\n"; - static ConstString g_platform_ios_simulator ("ios-simulator"); + std::string module_macros; if (Target *target = exe_ctx.GetTargetPtr()) { @@ -63,12 +72,51 @@ bool ExpressionSourceCode::GetText (std::string &text, lldb::LanguageType wrappi { if (lldb::PlatformSP platform_sp = target->GetPlatform()) { + static ConstString g_platform_ios_simulator ("ios-simulator"); if (platform_sp->GetPluginName() == g_platform_ios_simulator) { target_specific_defines = "typedef bool BOOL;\n"; } } } + + if (ClangModulesDeclVendor *decl_vendor = target->GetClangModulesDeclVendor()) + { + const ClangModulesDeclVendor::ModuleVector &hand_imported_modules = target->GetPersistentVariables().GetHandLoadedClangModules(); + ClangModulesDeclVendor::ModuleVector modules_for_macros; + + for (ClangModulesDeclVendor::ModuleID module : hand_imported_modules) + { + modules_for_macros.push_back(module); + } + + if (target->GetEnableAutoImportClangModules()) + { + if (StackFrame *frame = exe_ctx.GetFramePtr()) + { + if (Block *block = frame->GetFrameBlock()) + { + SymbolContext sc; + + block->CalculateSymbolContext(&sc); + + if (sc.comp_unit) + { + StreamString error_stream; + + decl_vendor->AddModulesForCompileUnit(*sc.comp_unit, modules_for_macros, error_stream); + } + } + } + } + + decl_vendor->ForEachMacro(modules_for_macros, [&module_macros] (const std::string &expansion) -> bool { + module_macros.append(expansion); + module_macros.append("\n"); + return false; + }); + } + } if (m_wrap) @@ -85,37 +133,31 @@ bool ExpressionSourceCode::GetText (std::string &text, lldb::LanguageType wrappi StreamString wrap_stream; + wrap_stream.Printf("%s\n%s\n%s\n%s\n", + module_macros.c_str(), + g_expression_prefix, + target_specific_defines, + m_prefix.c_str()); + switch (wrapping_language) { default: break; case lldb::eLanguageTypeC: - wrap_stream.Printf("%s \n" - "%s \n" - "%s \n" - "void \n" + wrap_stream.Printf("void \n" "%s(void *$__lldb_arg) \n" "{ \n" " %s; \n" "} \n", - g_expression_prefix, - target_specific_defines, - m_prefix.c_str(), m_name.c_str(), m_body.c_str()); break; case lldb::eLanguageTypeC_plus_plus: - wrap_stream.Printf("%s \n" - "%s \n" - "%s \n" - "void \n" + wrap_stream.Printf("void \n" "$__lldb_class::%s(void *$__lldb_arg) %s\n" "{ \n" " %s; \n" "} \n", - g_expression_prefix, - target_specific_defines, - m_prefix.c_str(), m_name.c_str(), (const_object ? "const" : ""), m_body.c_str()); @@ -123,10 +165,7 @@ bool ExpressionSourceCode::GetText (std::string &text, lldb::LanguageType wrappi case lldb::eLanguageTypeObjC: if (static_method) { - wrap_stream.Printf("%s \n" - "%s \n" - "%s \n" - "@interface $__lldb_objc_class ($__lldb_category) \n" + wrap_stream.Printf("@interface $__lldb_objc_class ($__lldb_category) \n" "+(void)%s:(void *)$__lldb_arg; \n" "@end \n" "@implementation $__lldb_objc_class ($__lldb_category) \n" @@ -135,19 +174,13 @@ bool ExpressionSourceCode::GetText (std::string &text, lldb::LanguageType wrappi " %s; \n" "} \n" "@end \n", - g_expression_prefix, - target_specific_defines, - m_prefix.c_str(), m_name.c_str(), m_name.c_str(), m_body.c_str()); } else { - wrap_stream.Printf("%s \n" - "%s \n" - "%s \n" - "@interface $__lldb_objc_class ($__lldb_category) \n" + wrap_stream.Printf("@interface $__lldb_objc_class ($__lldb_category) \n" "-(void)%s:(void *)$__lldb_arg; \n" "@end \n" "@implementation $__lldb_objc_class ($__lldb_category) \n" @@ -156,9 +189,6 @@ bool ExpressionSourceCode::GetText (std::string &text, lldb::LanguageType wrappi " %s; \n" "} \n" "@end \n", - g_expression_prefix, - target_specific_defines, - m_prefix.c_str(), m_name.c_str(), m_name.c_str(), m_body.c_str()); -- 2.7.4