https://github.com/Iasonaskrpr updated https://github.com/llvm/llvm-project/pull/221301
>From 60b41f22014814afcfaf66c2ff8bdfa34982bcfb Mon Sep 17 00:00:00 2001 From: Iasonaskrpr <[email protected]> Date: Fri, 4 Sep 2026 20:28:12 +0300 Subject: [PATCH 1/4] [lldb][Fortran] Added Fortran language plugin and tests --- lldb/include/lldb/Target/Language.h | 2 + lldb/source/Plugins/Language/CMakeLists.txt | 1 + .../Plugins/Language/Fortran/CMakeLists.txt | 12 ++++ .../Language/Fortran/FortranLanguage.cpp | 63 +++++++++++++++++++ .../Language/Fortran/FortranLanguage.h | 55 ++++++++++++++++ lldb/source/Target/Language.cpp | 14 +++++ lldb/unittests/Language/CMakeLists.txt | 1 + .../unittests/Language/Fortran/CMakeLists.txt | 6 ++ .../Language/Fortran/FortranLanguageTest.cpp | 40 ++++++++++++ 9 files changed, 194 insertions(+) create mode 100644 lldb/source/Plugins/Language/Fortran/CMakeLists.txt create mode 100644 lldb/source/Plugins/Language/Fortran/FortranLanguage.cpp create mode 100644 lldb/source/Plugins/Language/Fortran/FortranLanguage.h create mode 100644 lldb/unittests/Language/Fortran/CMakeLists.txt create mode 100644 lldb/unittests/Language/Fortran/FortranLanguageTest.cpp diff --git a/lldb/include/lldb/Target/Language.h b/lldb/include/lldb/Target/Language.h index 879a4f14783fa..c08994cc32e9f 100644 --- a/lldb/include/lldb/Target/Language.h +++ b/lldb/include/lldb/Target/Language.h @@ -443,6 +443,8 @@ class Language : public PluginInterface { /// Equivalent to \c LanguageIsC||LanguageIsObjC||LanguageIsCPlusPlus. static bool LanguageIsCFamily(lldb::LanguageType language); + static bool LanguageIsFortran(lldb::LanguageType language); + static bool LanguageIsPascal(lldb::LanguageType language); // return the primary language, so if LanguageIsC(l), return eLanguageTypeC, diff --git a/lldb/source/Plugins/Language/CMakeLists.txt b/lldb/source/Plugins/Language/CMakeLists.txt index 6367ab916c8fb..5377734af2f8d 100644 --- a/lldb/source/Plugins/Language/CMakeLists.txt +++ b/lldb/source/Plugins/Language/CMakeLists.txt @@ -7,3 +7,4 @@ set_property(DIRECTORY PROPERTY LLDB_TOLERATED_PLUGIN_DEPENDENCIES add_subdirectory(CPlusPlus) add_subdirectory(ObjC) add_subdirectory(ObjCPlusPlus) +add_subdirectory(Fortran) diff --git a/lldb/source/Plugins/Language/Fortran/CMakeLists.txt b/lldb/source/Plugins/Language/Fortran/CMakeLists.txt new file mode 100644 index 0000000000000..3ee934fa01f52 --- /dev/null +++ b/lldb/source/Plugins/Language/Fortran/CMakeLists.txt @@ -0,0 +1,12 @@ +add_lldb_library(lldbPluginFortranLanguage PLUGIN + FortranLanguage.cpp + + LINK_LIBS + lldbCore + lldbDataFormatters + lldbExpression + lldbHost + lldbSymbol + lldbTarget + lldbUtility +) diff --git a/lldb/source/Plugins/Language/Fortran/FortranLanguage.cpp b/lldb/source/Plugins/Language/Fortran/FortranLanguage.cpp new file mode 100644 index 0000000000000..5df2f36f92eb7 --- /dev/null +++ b/lldb/source/Plugins/Language/Fortran/FortranLanguage.cpp @@ -0,0 +1,63 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// This file implements the Fortran language plugin. +/// +//===----------------------------------------------------------------------===// + +#include "llvm/ADT/StringRef.h" + +#include "FortranLanguage.h" + +#include "lldb/Core/PluginManager.h" + +using namespace llvm; +using namespace lldb; +using namespace lldb_private; +using namespace lldb_private::formatters; + +LLDB_PLUGIN_DEFINE(FortranLanguage) + +void FortranLanguage::Initialize() { + PluginManager::RegisterPlugin(GetPluginNameStatic(), "Fortran Language", + CreateInstance); +} + +void FortranLanguage::Terminate() { + PluginManager::UnregisterPlugin(CreateInstance); +} + +StringRef FortranLanguage::GetPluginNameStatic() { + static llvm::StringRef g_name("fortran"); + return g_name; +} + +//------------------------------------------------------------------ +// PluginInterface protocol +//------------------------------------------------------------------ +StringRef FortranLanguage::GetPluginName() { return GetPluginNameStatic(); } + +uint32_t FortranLanguage::GetPluginVersion() { return 1; } + +Language *FortranLanguage::CreateInstance(LanguageType language) { + if (Language::LanguageIsFortran(language)) { + return new FortranLanguage(); + } + return nullptr; +} + +bool FortranLanguage::IsSourceFile(StringRef file_path) const { + const auto suffixes = {".f90", ".f", ".f95", ".f03", ".f08", + ".f18", ".for", ".ftn", ".fpp", ",f77"}; + for (auto suffix : suffixes) { + if (file_path.ends_with_insensitive(suffix)) + return true; + } + return false; +} diff --git a/lldb/source/Plugins/Language/Fortran/FortranLanguage.h b/lldb/source/Plugins/Language/Fortran/FortranLanguage.h new file mode 100644 index 0000000000000..b3958c2e8906e --- /dev/null +++ b/lldb/source/Plugins/Language/Fortran/FortranLanguage.h @@ -0,0 +1,55 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// This file defines the Fortran language plugin. +/// +//===----------------------------------------------------------------------===// + +#ifndef LLDB_SOURCE_PLUGINS_LANGUAGE_FORTRAN_FORTRANLANGUAGE_H +#define LLDB_SOURCE_PLUGINS_LANGUAGE_FORTRAN_FORTRANLANGUAGE_H +#include "lldb/Target/Language.h" + +#include "llvm/ADT/StringRef.h" + +#include "lldb/Target/Language.h" +#include "lldb/Utility/ConstString.h" +#include "lldb/lldb-private.h" + +namespace lldb_private { + +class FortranLanguage : public Language { +public: + FortranLanguage() = default; + + ~FortranLanguage() override = default; + + lldb::LanguageType GetLanguageType() const override { + return lldb::eLanguageTypeFortran90; + } + + // Static Functions + static void Initialize(); + + static void Terminate(); + + static lldb_private::Language *CreateInstance(lldb::LanguageType language); + + static llvm::StringRef GetPluginNameStatic(); + + // PluginInterface protocol + llvm::StringRef GetPluginName() override; + + uint32_t GetPluginVersion(); + + bool IsSourceFile(llvm::StringRef file_path) const override; +}; + +} // namespace lldb_private + +#endif // LLDB_SOURCE_PLUGINS_LANGUAGE_FORTRAN_FORTRANLANGUAGE_H diff --git a/lldb/source/Target/Language.cpp b/lldb/source/Target/Language.cpp index 077c403f4ea58..a4d6031b4b27d 100644 --- a/lldb/source/Target/Language.cpp +++ b/lldb/source/Target/Language.cpp @@ -396,6 +396,20 @@ bool Language::LanguageIsCFamily(LanguageType language) { } } +bool Language::LanguageIsFortran(LanguageType language) { + switch (language) { + case eLanguageTypeFortran77: + case eLanguageTypeFortran90: + case eLanguageTypeFortran95: + case eLanguageTypeFortran03: + case eLanguageTypeFortran08: + case eLanguageTypeFortran18: + return true; + default: + return false; + } +} + bool Language::LanguageIsPascal(LanguageType language) { switch (language) { case eLanguageTypePascal83: diff --git a/lldb/unittests/Language/CMakeLists.txt b/lldb/unittests/Language/CMakeLists.txt index a0bdc62af98c6..26710ff8896e2 100644 --- a/lldb/unittests/Language/CMakeLists.txt +++ b/lldb/unittests/Language/CMakeLists.txt @@ -1,3 +1,4 @@ add_subdirectory(CPlusPlus) add_subdirectory(CLanguages) add_subdirectory(ObjC) +add_subdirectory(Fortran) diff --git a/lldb/unittests/Language/Fortran/CMakeLists.txt b/lldb/unittests/Language/Fortran/CMakeLists.txt new file mode 100644 index 0000000000000..661b12ebf8950 --- /dev/null +++ b/lldb/unittests/Language/Fortran/CMakeLists.txt @@ -0,0 +1,6 @@ +add_lldb_unittest(LanguageFortranLanguageTests + FortranLanguageTest.cpp + + LINK_LIBS + lldbPluginFortranLanguage +) diff --git a/lldb/unittests/Language/Fortran/FortranLanguageTest.cpp b/lldb/unittests/Language/Fortran/FortranLanguageTest.cpp new file mode 100644 index 0000000000000..d8d7287e0104c --- /dev/null +++ b/lldb/unittests/Language/Fortran/FortranLanguageTest.cpp @@ -0,0 +1,40 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// This file tests the Fortran plugin features. +/// +//===----------------------------------------------------------------------===// + +#include "Plugins/Language/Fortran/FortranLanguage.h" +#include "TestingSupport/SubsystemRAII.h" +#include "lldb/lldb-enumerations.h" + +#include "gmock/gmock.h" +#include "gtest/gtest.h" + +using namespace lldb_private; + +/// Returns the name of the LLDB plugin for the given language or an empty +/// string if there is no fitting plugin. +static llvm::StringRef GetPluginName(lldb::LanguageType language) { + if (Language *language_plugin = Language::FindPlugin(language)) + return language_plugin->GetPluginName(); + return ""; +} + +TEST(FortranLanguage, LookupFortranLanguageByLanguageType) { + SubsystemRAII<FortranLanguage> langs; + + EXPECT_EQ(GetPluginName(lldb::eLanguageTypeFortran77), "fortran"); + EXPECT_EQ(GetPluginName(lldb::eLanguageTypeFortran90), "fortran"); + EXPECT_EQ(GetPluginName(lldb::eLanguageTypeFortran95), "fortran"); + EXPECT_EQ(GetPluginName(lldb::eLanguageTypeFortran03), "fortran"); + EXPECT_EQ(GetPluginName(lldb::eLanguageTypeFortran08), "fortran"); + EXPECT_EQ(GetPluginName(lldb::eLanguageTypeFortran18), "fortran"); +} \ No newline at end of file >From b67ef084fc224e69bbdeb5dbe3fdb111123055be Mon Sep 17 00:00:00 2001 From: Iasonas Karaprodromidis <[email protected]> Date: Sun, 6 Sep 2026 22:26:00 +0300 Subject: [PATCH 2/4] Fix missing newline at end of file Add missing newline at end of FortranLanguageTest.cpp --- lldb/unittests/Language/Fortran/FortranLanguageTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lldb/unittests/Language/Fortran/FortranLanguageTest.cpp b/lldb/unittests/Language/Fortran/FortranLanguageTest.cpp index d8d7287e0104c..49432f2fed039 100644 --- a/lldb/unittests/Language/Fortran/FortranLanguageTest.cpp +++ b/lldb/unittests/Language/Fortran/FortranLanguageTest.cpp @@ -37,4 +37,4 @@ TEST(FortranLanguage, LookupFortranLanguageByLanguageType) { EXPECT_EQ(GetPluginName(lldb::eLanguageTypeFortran03), "fortran"); EXPECT_EQ(GetPluginName(lldb::eLanguageTypeFortran08), "fortran"); EXPECT_EQ(GetPluginName(lldb::eLanguageTypeFortran18), "fortran"); -} \ No newline at end of file +} >From 03a9832a4651a95c932d8a0e6643dce73128a943 Mon Sep 17 00:00:00 2001 From: Iasonas Karaprodromidis <[email protected]> Date: Sun, 6 Sep 2026 22:27:08 +0300 Subject: [PATCH 3/4] Deleted redundant comments Co-authored-by: Jonas Devlieghere <[email protected]> --- lldb/source/Plugins/Language/Fortran/FortranLanguage.cpp | 8 -------- lldb/source/Plugins/Language/Fortran/FortranLanguage.h | 7 ------- lldb/unittests/Language/Fortran/FortranLanguageTest.cpp | 5 ----- 3 files changed, 20 deletions(-) diff --git a/lldb/source/Plugins/Language/Fortran/FortranLanguage.cpp b/lldb/source/Plugins/Language/Fortran/FortranLanguage.cpp index 5df2f36f92eb7..40b8014b45416 100644 --- a/lldb/source/Plugins/Language/Fortran/FortranLanguage.cpp +++ b/lldb/source/Plugins/Language/Fortran/FortranLanguage.cpp @@ -5,11 +5,6 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// -/// -/// \file -/// This file implements the Fortran language plugin. -/// -//===----------------------------------------------------------------------===// #include "llvm/ADT/StringRef.h" @@ -38,9 +33,6 @@ StringRef FortranLanguage::GetPluginNameStatic() { return g_name; } -//------------------------------------------------------------------ -// PluginInterface protocol -//------------------------------------------------------------------ StringRef FortranLanguage::GetPluginName() { return GetPluginNameStatic(); } uint32_t FortranLanguage::GetPluginVersion() { return 1; } diff --git a/lldb/source/Plugins/Language/Fortran/FortranLanguage.h b/lldb/source/Plugins/Language/Fortran/FortranLanguage.h index b3958c2e8906e..fdb7df922aa88 100644 --- a/lldb/source/Plugins/Language/Fortran/FortranLanguage.h +++ b/lldb/source/Plugins/Language/Fortran/FortranLanguage.h @@ -5,11 +5,6 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// -/// -/// \file -/// This file defines the Fortran language plugin. -/// -//===----------------------------------------------------------------------===// #ifndef LLDB_SOURCE_PLUGINS_LANGUAGE_FORTRAN_FORTRANLANGUAGE_H #define LLDB_SOURCE_PLUGINS_LANGUAGE_FORTRAN_FORTRANLANGUAGE_H @@ -33,7 +28,6 @@ class FortranLanguage : public Language { return lldb::eLanguageTypeFortran90; } - // Static Functions static void Initialize(); static void Terminate(); @@ -42,7 +36,6 @@ class FortranLanguage : public Language { static llvm::StringRef GetPluginNameStatic(); - // PluginInterface protocol llvm::StringRef GetPluginName() override; uint32_t GetPluginVersion(); diff --git a/lldb/unittests/Language/Fortran/FortranLanguageTest.cpp b/lldb/unittests/Language/Fortran/FortranLanguageTest.cpp index 49432f2fed039..d24f1b00ecdeb 100644 --- a/lldb/unittests/Language/Fortran/FortranLanguageTest.cpp +++ b/lldb/unittests/Language/Fortran/FortranLanguageTest.cpp @@ -5,11 +5,6 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// -/// -/// \file -/// This file tests the Fortran plugin features. -/// -//===----------------------------------------------------------------------===// #include "Plugins/Language/Fortran/FortranLanguage.h" #include "TestingSupport/SubsystemRAII.h" >From af5f8aceb5e7b3ce12e34551c65ef1b15707d9e7 Mon Sep 17 00:00:00 2001 From: Iasonaskrpr <[email protected]> Date: Mon, 7 Sep 2026 17:08:32 +0300 Subject: [PATCH 4/4] [lldb][Fortran] Applied reccomended changes from code review --- .../Language/Fortran/FortranLanguage.cpp | 6 ++--- .../Language/Fortran/FortranLanguageTest.cpp | 24 ++++++++----------- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/lldb/source/Plugins/Language/Fortran/FortranLanguage.cpp b/lldb/source/Plugins/Language/Fortran/FortranLanguage.cpp index 40b8014b45416..7543e8dded042 100644 --- a/lldb/source/Plugins/Language/Fortran/FortranLanguage.cpp +++ b/lldb/source/Plugins/Language/Fortran/FortranLanguage.cpp @@ -38,15 +38,15 @@ StringRef FortranLanguage::GetPluginName() { return GetPluginNameStatic(); } uint32_t FortranLanguage::GetPluginVersion() { return 1; } Language *FortranLanguage::CreateInstance(LanguageType language) { - if (Language::LanguageIsFortran(language)) { + if (Language::LanguageIsFortran(language)) return new FortranLanguage(); - } + return nullptr; } bool FortranLanguage::IsSourceFile(StringRef file_path) const { const auto suffixes = {".f90", ".f", ".f95", ".f03", ".f08", - ".f18", ".for", ".ftn", ".fpp", ",f77"}; + ".f18", ".for", ".ftn", ".fpp", ".f77"}; for (auto suffix : suffixes) { if (file_path.ends_with_insensitive(suffix)) return true; diff --git a/lldb/unittests/Language/Fortran/FortranLanguageTest.cpp b/lldb/unittests/Language/Fortran/FortranLanguageTest.cpp index d24f1b00ecdeb..c1fe22345d710 100644 --- a/lldb/unittests/Language/Fortran/FortranLanguageTest.cpp +++ b/lldb/unittests/Language/Fortran/FortranLanguageTest.cpp @@ -15,21 +15,17 @@ using namespace lldb_private; -/// Returns the name of the LLDB plugin for the given language or an empty -/// string if there is no fitting plugin. -static llvm::StringRef GetPluginName(lldb::LanguageType language) { - if (Language *language_plugin = Language::FindPlugin(language)) - return language_plugin->GetPluginName(); - return ""; -} - TEST(FortranLanguage, LookupFortranLanguageByLanguageType) { SubsystemRAII<FortranLanguage> langs; - EXPECT_EQ(GetPluginName(lldb::eLanguageTypeFortran77), "fortran"); - EXPECT_EQ(GetPluginName(lldb::eLanguageTypeFortran90), "fortran"); - EXPECT_EQ(GetPluginName(lldb::eLanguageTypeFortran95), "fortran"); - EXPECT_EQ(GetPluginName(lldb::eLanguageTypeFortran03), "fortran"); - EXPECT_EQ(GetPluginName(lldb::eLanguageTypeFortran08), "fortran"); - EXPECT_EQ(GetPluginName(lldb::eLanguageTypeFortran18), "fortran"); + const auto types = { + lldb::eLanguageTypeFortran77, lldb::eLanguageTypeFortran90, + lldb::eLanguageTypeFortran95, lldb::eLanguageTypeFortran03, + lldb::eLanguageTypeFortran08, lldb::eLanguageTypeFortran18}; + + for (lldb::LanguageType lang_type : types) { + Language *lang = Language::FindPlugin(lang_type); + ASSERT_NE(lang, nullptr); + EXPECT_EQ(lang->GetPluginName(), "fortran"); + } } _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
