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.
<rdar://problem/20756642>
llvm-svn: 236266
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 @@
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 @@
{
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 @@
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 @@
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 @@
" %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 @@
" %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());