Made macros from modules be injected before our
authorSean Callanan <scallanan@apple.com>
Thu, 30 Apr 2015 21:49:58 +0000 (21:49 +0000)
committerSean Callanan <scallanan@apple.com>
Thu, 30 Apr 2015 21:49:58 +0000 (21:49 +0000)
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

lldb/source/Expression/ClangUserExpression.cpp
lldb/source/Expression/ExpressionSourceCode.cpp

index ba28431..ca2c03e 100644 (file)
@@ -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<ExpressionSourceCode> source_code (ExpressionSourceCode::CreateWrapped(prefix.c_str(), m_expr_text.c_str()));
index b3f335f..9a42510 100644 (file)
 #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());