mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-26 15:11:00 +00:00
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
This commit is contained in:
parent
1c545baf96
commit
68f85e7d6a
@ -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()));
|
||||
|
@ -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());
|
||||
|
Loading…
Reference in New Issue
Block a user