[Lldb-commits] [lldb] r236266 - Made macros from modules be injected before our

Sean Callanan scallanan at apple.com
Thu Apr 30 14:49:58 PDT 2015


Author: spyffe
Date: Thu Apr 30 16:49:58 2015
New Revision: 236266

URL: http://llvm.org/viewvc/llvm-project?rev=236266&view=rev
Log:
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>

Modified:
    lldb/trunk/source/Expression/ClangUserExpression.cpp
    lldb/trunk/source/Expression/ExpressionSourceCode.cpp

Modified: lldb/trunk/source/Expression/ClangUserExpression.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/ClangUserExpression.cpp?rev=236266&r1=236265&r2=236266&view=diff
==============================================================================
--- lldb/trunk/source/Expression/ClangUserExpression.cpp (original)
+++ lldb/trunk/source/Expression/ClangUserExpression.cpp Thu Apr 30 16:49:58 2015
@@ -485,12 +485,6 @@ ClangUserExpression::Parse (Stream &erro
                 }
             }
         }
-        
-        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()));

Modified: lldb/trunk/source/Expression/ExpressionSourceCode.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/ExpressionSourceCode.cpp?rev=236266&r1=236265&r2=236266&view=diff
==============================================================================
--- lldb/trunk/source/Expression/ExpressionSourceCode.cpp (original)
+++ lldb/trunk/source/Expression/ExpressionSourceCode.cpp Thu Apr 30 16:49:58 2015
@@ -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:
         {
             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:
         
         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:
         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:
                                    "    %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:
                                    "    %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());





More information about the lldb-commits mailing list