71 changes: 71 additions & 0 deletions lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
//===-- CPlusPlusLanguage.cpp --------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "CPlusPlusLanguage.h"

#include "lldb/Core/ConstString.h"
#include "lldb/Core/PluginManager.h"

using namespace lldb;
using namespace lldb_private;

void
CPlusPlusLanguage::Initialize()
{
PluginManager::RegisterPlugin (GetPluginNameStatic(),
"C++ Language",
CreateInstance);
}

void
CPlusPlusLanguage::Terminate()
{
PluginManager::UnregisterPlugin (CreateInstance);
}

lldb_private::ConstString
CPlusPlusLanguage::GetPluginNameStatic()
{
static ConstString g_name("cplusplus");
return g_name;
}


//------------------------------------------------------------------
// PluginInterface protocol
//------------------------------------------------------------------
lldb_private::ConstString
CPlusPlusLanguage::GetPluginName()
{
return GetPluginNameStatic();
}

uint32_t
CPlusPlusLanguage::GetPluginVersion()
{
return 1;
}

//------------------------------------------------------------------
// Static Functions
//------------------------------------------------------------------
Language *
CPlusPlusLanguage::CreateInstance (lldb::LanguageType language)
{
switch (language)
{
case lldb::eLanguageTypeC_plus_plus:
case lldb::eLanguageTypeC_plus_plus_03:
case lldb::eLanguageTypeC_plus_plus_11:
case lldb::eLanguageTypeC_plus_plus_14:
return new CPlusPlusLanguage();
default:
return nullptr;
}
}
63 changes: 63 additions & 0 deletions lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
//===-- CPlusPlusLanguage.h ----------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef liblldb_CPlusPlusLanguage_h_
#define liblldb_CPlusPlusLanguage_h_

// C Includes
// C++ Includes
// Other libraries and framework includes
// Project includes
#include "lldb/lldb-private.h"
#include "lldb/Target/Language.h"

namespace lldb_private {

class CPlusPlusLanguage :
public Language
{
public:
virtual ~CPlusPlusLanguage() = default;

CPlusPlusLanguage () = default;

lldb::LanguageType
GetLanguageType () const
{
return lldb::eLanguageTypeC_plus_plus;
}

//------------------------------------------------------------------
// Static Functions
//------------------------------------------------------------------
static void
Initialize();

static void
Terminate();

static lldb_private::Language *
CreateInstance (lldb::LanguageType language);

static lldb_private::ConstString
GetPluginNameStatic();

//------------------------------------------------------------------
// PluginInterface protocol
//------------------------------------------------------------------
virtual ConstString
GetPluginName();

virtual uint32_t
GetPluginVersion();
};

} // namespace lldb_private

#endif // liblldb_CPlusPlusLanguage_h_
5 changes: 5 additions & 0 deletions lldb/source/Plugins/Language/ObjC/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
set(LLVM_NO_RTTI 1)

add_lldb_library(lldbPluginAppleObjCLanguage
AppleObjCLanguage.cpp
)
68 changes: 68 additions & 0 deletions lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
//===-- ObjCLanguage.cpp --------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "ObjCLanguage.h"

#include "lldb/Core/ConstString.h"
#include "lldb/Core/PluginManager.h"

using namespace lldb;
using namespace lldb_private;

void
ObjCLanguage::Initialize()
{
PluginManager::RegisterPlugin (GetPluginNameStatic(),
"Objective-C Language",
CreateInstance);
}

void
ObjCLanguage::Terminate()
{
PluginManager::UnregisterPlugin (CreateInstance);
}

lldb_private::ConstString
ObjCLanguage::GetPluginNameStatic()
{
static ConstString g_name("objc");
return g_name;
}


//------------------------------------------------------------------
// PluginInterface protocol
//------------------------------------------------------------------
lldb_private::ConstString
ObjCLanguage::GetPluginName()
{
return GetPluginNameStatic();
}

uint32_t
ObjCLanguage::GetPluginVersion()
{
return 1;
}

//------------------------------------------------------------------
// Static Functions
//------------------------------------------------------------------
Language *
ObjCLanguage::CreateInstance (lldb::LanguageType language)
{
switch (language)
{
case lldb::eLanguageTypeObjC:
return new ObjCLanguage();
default:
return nullptr;
}
}
63 changes: 63 additions & 0 deletions lldb/source/Plugins/Language/ObjC/ObjCLanguage.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
//===-- ObjCLanguage.h ----------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef liblldb_ObjCLanguage_h_
#define liblldb_ObjCLanguage_h_

// C Includes
// C++ Includes
// Other libraries and framework includes
// Project includes
#include "lldb/lldb-private.h"
#include "lldb/Target/Language.h"

namespace lldb_private {

class ObjCLanguage :
public Language
{
public:
virtual ~ObjCLanguage() = default;

ObjCLanguage () = default;

lldb::LanguageType
GetLanguageType () const
{
return lldb::eLanguageTypeObjC;
}

//------------------------------------------------------------------
// Static Functions
//------------------------------------------------------------------
static void
Initialize();

static void
Terminate();

static lldb_private::Language *
CreateInstance (lldb::LanguageType language);

static lldb_private::ConstString
GetPluginNameStatic();

//------------------------------------------------------------------
// PluginInterface protocol
//------------------------------------------------------------------
virtual ConstString
GetPluginName();

virtual uint32_t
GetPluginVersion();
};

} // namespace lldb_private

#endif // liblldb_ObjCLanguage_h_
5 changes: 5 additions & 0 deletions lldb/source/Plugins/Language/ObjCPlusPlus/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
set(LLVM_NO_RTTI 1)

add_lldb_library(lldbPluginObjCPlusPlusLanguage
ObjCPlusPlusLanguage.cpp
)
68 changes: 68 additions & 0 deletions lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
//===-- ObjCPlusPlusLanguage.cpp --------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "ObjCPlusPlusLanguage.h"

#include "lldb/Core/ConstString.h"
#include "lldb/Core/PluginManager.h"

using namespace lldb;
using namespace lldb_private;

void
ObjCPlusPlusLanguage::Initialize()
{
PluginManager::RegisterPlugin (GetPluginNameStatic(),
"Objective-C++ Language",
CreateInstance);
}

void
ObjCPlusPlusLanguage::Terminate()
{
PluginManager::UnregisterPlugin (CreateInstance);
}

lldb_private::ConstString
ObjCPlusPlusLanguage::GetPluginNameStatic()
{
static ConstString g_name("objcplusplus");
return g_name;
}


//------------------------------------------------------------------
// PluginInterface protocol
//------------------------------------------------------------------
lldb_private::ConstString
ObjCPlusPlusLanguage::GetPluginName()
{
return GetPluginNameStatic();
}

uint32_t
ObjCPlusPlusLanguage::GetPluginVersion()
{
return 1;
}

//------------------------------------------------------------------
// Static Functions
//------------------------------------------------------------------
Language *
ObjCPlusPlusLanguage::CreateInstance (lldb::LanguageType language)
{
switch (language)
{
case lldb::eLanguageTypeObjC_plus_plus:
return new ObjCPlusPlusLanguage();
default:
return nullptr;
}
}
63 changes: 63 additions & 0 deletions lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
//===-- ObjCPlusPlusLanguage.h ----------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef liblldb_ObjCPlusPlusLanguage_h_
#define liblldb_ObjCPlusPlusLanguage_h_

// C Includes
// C++ Includes
// Other libraries and framework includes
// Project includes
#include "lldb/lldb-private.h"
#include "lldb/Target/Language.h"

namespace lldb_private {

class ObjCPlusPlusLanguage :
public Language
{
public:
virtual ~ObjCPlusPlusLanguage() = default;

ObjCPlusPlusLanguage () = default;

lldb::LanguageType
GetLanguageType () const
{
return lldb::eLanguageTypeObjC_plus_plus;
}

//------------------------------------------------------------------
// Static Functions
//------------------------------------------------------------------
static void
Initialize();

static void
Terminate();

static lldb_private::Language *
CreateInstance (lldb::LanguageType language);

static lldb_private::ConstString
GetPluginNameStatic();

//------------------------------------------------------------------
// PluginInterface protocol
//------------------------------------------------------------------
virtual ConstString
GetPluginName();

virtual uint32_t
GetPluginVersion();
};

} // namespace lldb_private

#endif // liblldb_CPlusPlusLanguage_h_
101 changes: 101 additions & 0 deletions lldb/source/Target/Language.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
//===-- Language.cpp -------------------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include <functional>
#include <map>

#include "lldb/Target/Language.h"

#include "lldb/Host/Mutex.h"
#include "lldb/Core/PluginManager.h"

using namespace lldb;
using namespace lldb_private;

typedef std::unique_ptr<Language> LanguageUP;
typedef std::map<lldb::LanguageType, LanguageUP> LanguagesMap;

static LanguagesMap&
GetLanguagesMap ()
{
static LanguagesMap *g_map = nullptr;
static std::once_flag g_initialize;

std::call_once(g_initialize, [] {
g_map = new LanguagesMap(); // NOTE: INTENTIONAL LEAK due to global destructor chain
});

return *g_map;
}
static Mutex&
GetLanguagesMutex ()
{
static Mutex *g_mutex = nullptr;
static std::once_flag g_initialize;

std::call_once(g_initialize, [] {
g_mutex = new Mutex(); // NOTE: INTENTIONAL LEAK due to global destructor chain
});

return *g_mutex;
}

Language*
Language::FindPlugin (lldb::LanguageType language)
{
Mutex::Locker locker(GetLanguagesMutex());
LanguagesMap& map(GetLanguagesMap());
auto iter = map.find(language), end = map.end();
if (iter != end)
return iter->second.get();

Language *language_ptr = nullptr;
LanguageCreateInstance create_callback;

for (uint32_t idx = 0;
(create_callback = PluginManager::GetLanguageCreateCallbackAtIndex(idx)) != nullptr;
++idx)
{
language_ptr = create_callback(language);

if (language_ptr)
{
map[language] = std::unique_ptr<Language>(language_ptr);
return language_ptr;
}
}

return nullptr;
}

void
Language::ForEach (std::function<bool(Language*)> callback)
{
Mutex::Locker locker(GetLanguagesMutex());
LanguagesMap& map(GetLanguagesMap());
for (const auto& entry : map)
{
if (!callback(entry.second.get()))
break;
}
}

//----------------------------------------------------------------------
// Constructor
//----------------------------------------------------------------------
Language::Language()
{
}

//----------------------------------------------------------------------
// Destructor
//----------------------------------------------------------------------
Language::~Language()
{
}