https://github.com/Iasonaskrpr created https://github.com/llvm/llvm-project/pull/210377
Depends on #207764. This PR introduces the foundational skeleton files and infrastructure required to register Fortran as a supported language plugin in LLDB. At this stage, the `TypeSystemFortran` and `DWARFASTParserFortran` implementations return null/stub implementations. ### Changes - **Language Plugin**: Adds the baseline `LanguageFortran` plugin to recognize Fortran programs. - **TypeSystem**: Adds the `TypeSystemFortran` skeleton class and handles its initial registration. - **DWARF Parser**: Adds the `DWARFASTParserFortran` boilerplate required by the type system. Part of the Add Fortran support to LLDB GSoC 2026 project. >From df22af8f68bbc694f603c11148b9a08b1fe9694d Mon Sep 17 00:00:00 2001 From: Iasonaskrpr <[email protected]> Date: Sat, 9 May 2026 18:50:07 +0300 Subject: [PATCH 1/9] [lldb] Added boilerplate for new TypeSystem and DWARFASTParser --- .../Plugins/SymbolFile/DWARF/CMakeLists.txt | 3 + .../Plugins/SymbolFile/DWARF/DWARFASTParser.h | 2 +- .../DWARF/DWARFASTParserFortran.cpp | 39 ++ .../SymbolFile/DWARF/DWARFASTParserFortran.h | 75 +++ lldb/source/Plugins/TypeSystem/CMakeLists.txt | 1 + .../Plugins/TypeSystem/Fortran/CMakeLists.txt | 12 + .../TypeSystem/Fortran/TypeSystemFortran.cpp | 0 .../TypeSystem/Fortran/TypeSystemFortran.h | 480 ++++++++++++++++++ 8 files changed, 611 insertions(+), 1 deletion(-) create mode 100644 lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserFortran.cpp create mode 100644 lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserFortran.h create mode 100644 lldb/source/Plugins/TypeSystem/Fortran/CMakeLists.txt create mode 100644 lldb/source/Plugins/TypeSystem/Fortran/TypeSystemFortran.cpp create mode 100644 lldb/source/Plugins/TypeSystem/Fortran/TypeSystemFortran.h diff --git a/lldb/source/Plugins/SymbolFile/DWARF/CMakeLists.txt b/lldb/source/Plugins/SymbolFile/DWARF/CMakeLists.txt index 3f7cf023ac21c..b198ec4e99b24 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/CMakeLists.txt +++ b/lldb/source/Plugins/SymbolFile/DWARF/CMakeLists.txt @@ -16,6 +16,7 @@ add_lldb_library(lldbPluginSymbolFileDWARF PLUGIN DIERef.cpp DWARFASTParser.cpp DWARFASTParserClang.cpp + DWARFASTParserFortran.cpp DWARFAttribute.cpp DWARFBaseDIE.cpp DWARFCompileUnit.cpp @@ -57,7 +58,9 @@ add_lldb_library(lldbPluginSymbolFileDWARF PLUGIN lldbPluginObjCLanguage lldbPluginCPlusPlusLanguage lldbPluginExpressionParserClang + lldbPluginFortranLanguage lldbPluginTypeSystemClang + lldbPluginTypeSystemFortran CLANG_LIBS clangAST clangBasic diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParser.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParser.h index 80f7becc1b24b..8f32874d788af 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParser.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParser.h @@ -29,7 +29,7 @@ class SymbolFileDWARF; class DWARFASTParser { public: - enum class Kind { DWARFASTParserClang }; + enum class Kind { DWARFASTParserClang, DWARFASTParserFortran }; DWARFASTParser(Kind kind) : m_kind(kind) {} virtual ~DWARFASTParser() = default; diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserFortran.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserFortran.cpp new file mode 100644 index 0000000000000..0973f658f6b04 --- /dev/null +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserFortran.cpp @@ -0,0 +1,39 @@ +//===-- DWARFASTParserFortran.cpp -----------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "DWARFASTParserFortran.h" + +using namespace lldb; +using namespace lldb_private; + +DWARFASTParserFortran::DWARFASTParserFortran( + lldb_private::TypeSystemFortran m_ast) + : lldb_private::plugin::dwarf::DWARFASTParser(Kind::DWARFASTParserFortran), + m_ast(m_ast) {} + +DWARFASTParserFortran::~DWARFASTParserFortran() {} + +lldb::TypeSP DWARFASTParserFortran::ParseTypeFromDWARF( + const lldb_private::SymbolContext &sc, + const lldb_private::plugin::dwarf::DWARFDIE &die, bool *type_is_new_ptr) { + // TODO +} + +lldb_private::Function *DWARFASTParserFortran::ParseFunctionFromDWARF( + lldb_private::CompileUnit &comp_unit, + const lldb_private::plugin::dwarf::DWARFDIE &die, + lldb_private::AddressRanges ranges) { + // TODO +} + +bool DWARFASTParserFortran::CompleteTypeFromDWARF( + const lldb_private::plugin::dwarf::DWARFDIE &die, lldb_private::Type *type, + const lldb_private::CompilerType &compiler_type) { + // TODO + return false; +} diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserFortran.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserFortran.h new file mode 100644 index 0000000000000..6b26c798d190b --- /dev/null +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserFortran.h @@ -0,0 +1,75 @@ +//===-- DWARFASTParserFortran.h -------------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFASTPARSERFORTRAN_H +#define LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFASTPARSERFORTRAN_H + +#include "DWARFASTParser.h" +#include "Plugins/SymbolFile/DWARF/DWARFDIE.h" +#include "Plugins/TypeSystem/Fortran/TypeSystemFortran.h" + +namespace lldb_private { +class CompileUnit; +class ExecutionContext; +} // namespace lldb_private + +class DWARFASTParserFortran + : public lldb_private::plugin::dwarf::DWARFASTParser { +public: + DWARFASTParserFortran(lldb_private::TypeSystemFortran m_ast); + + ~DWARFASTParserFortran() override; + + lldb::TypeSP + ParseTypeFromDWARF(const lldb_private::SymbolContext &sc, + const lldb_private::plugin::dwarf::DWARFDIE &die, + bool *type_is_new_ptr) override; + + lldb_private::Function * + ParseFunctionFromDWARF(lldb_private::CompileUnit &comp_unit, + const lldb_private::plugin::dwarf::DWARFDIE &die, + lldb_private::AddressRanges ranges) override; + + bool CompleteTypeFromDWARF( + const lldb_private::plugin::dwarf::DWARFDIE &die, + lldb_private::Type *type, + const lldb_private::CompilerType &compiler_type) override; + + lldb_private::ConstString ConstructDemangledNameFromDWARF( + const lldb_private::plugin::dwarf::DWARFDIE &die) override { + return lldb_private::ConstString(); + } + + lldb_private::CompilerDecl GetDeclForUIDFromDWARF( + const lldb_private::plugin::dwarf::DWARFDIE &die) override { + return lldb_private::CompilerDecl(); + } + + lldb_private::CompilerDeclContext GetDeclContextForUIDFromDWARF( + const lldb_private::plugin::dwarf::DWARFDIE &die) override { + return lldb_private::CompilerDeclContext(); + } + + lldb_private::CompilerDeclContext GetDeclContextContainingUIDFromDWARF( + const lldb_private::plugin::dwarf::DWARFDIE &die) override { + return lldb_private::CompilerDeclContext(); + } + + void EnsureAllDIEsInDeclContextHaveBeenParsed( + lldb_private::CompilerDeclContext decl_context) override {} + + std::string GetDIEClassTemplateParams( + lldb_private::plugin::dwarf::DWARFDIE die) override { + return {}; + } + +private: + lldb_private::TypeSystemFortran &m_ast; +}; + +#endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFASTPARSERFORTRAN_H diff --git a/lldb/source/Plugins/TypeSystem/CMakeLists.txt b/lldb/source/Plugins/TypeSystem/CMakeLists.txt index 47e32ff176d8c..24431c14fca61 100644 --- a/lldb/source/Plugins/TypeSystem/CMakeLists.txt +++ b/lldb/source/Plugins/TypeSystem/CMakeLists.txt @@ -3,3 +3,4 @@ set_property(DIRECTORY PROPERTY LLDB_PLUGIN_KIND TypeSystem) set_property(DIRECTORY PROPERTY LLDB_TOLERATED_PLUGIN_DEPENDENCIES SymbolFile) add_subdirectory(Clang) +add_subdirectory(Fortran) \ No newline at end of file diff --git a/lldb/source/Plugins/TypeSystem/Fortran/CMakeLists.txt b/lldb/source/Plugins/TypeSystem/Fortran/CMakeLists.txt new file mode 100644 index 0000000000000..c78b70d48eb31 --- /dev/null +++ b/lldb/source/Plugins/TypeSystem/Fortran/CMakeLists.txt @@ -0,0 +1,12 @@ +add_lldb_library(lldbPluginTypeSystemFortran PLUGIN + TypeSystemFortran.cpp + + LINK_COMPONENTS + Support + LINK_LIBS + lldbCore + lldbSymbol + lldbTarget + lldbUtility + lldbPluginSymbolFileDWARF +) diff --git a/lldb/source/Plugins/TypeSystem/Fortran/TypeSystemFortran.cpp b/lldb/source/Plugins/TypeSystem/Fortran/TypeSystemFortran.cpp new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/lldb/source/Plugins/TypeSystem/Fortran/TypeSystemFortran.h b/lldb/source/Plugins/TypeSystem/Fortran/TypeSystemFortran.h new file mode 100644 index 0000000000000..be1844a16853c --- /dev/null +++ b/lldb/source/Plugins/TypeSystem/Fortran/TypeSystemFortran.h @@ -0,0 +1,480 @@ +//===-- TypeSystemFortran.h -------------------------------------*- C++ -*-===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#ifndef LLDB_SOURCE_PLUGINS_TYPESYSTEM_FORTRAN_TYPESYSTEMFORTRAN_H +#define LLDB_SOURCE_PLUGINS_TYPESYSTEM_FORTRAN_TYPESYSTEMFORTRAN_H +#include "lldb/Symbol/TypeSystem.h" +#include "llvm/Support/ErrorHandling.h" +namespace lldb_private { + +class TypeSystemFortran : public TypeSystem { + + // llvm casting support + bool isA(const void *ClassID) const override { return ClassID == &ID; } + static bool classof(const TypeSystem *ts) { return ts->isA(&ID); } + + TypeSystemFortran(); + ~TypeSystemFortran(); + + // CompilerDecl functions + ConstString DeclGetName(void *opaque_decl) override { return ConstString(); } + + CompilerType GetTypeForDecl(void *opaque_decl) override { + return CompilerType(); + } + + // CompilerDeclContext functions + + ConstString DeclContextGetName(void *opaque_decl_ctx) override { + return ConstString(); + } + + ConstString DeclContextGetScopeQualifiedName(void *opaque_decl_ctx) override { + return ConstString(); + } + + bool DeclContextIsClassMethod(void *opaque_decl_ctx) override { + return false; + } + + bool DeclContextIsContainedInLookup(void *opaque_decl_ctx, + void *other_opaque_decl_ctx) override { + return false; + } + + lldb::LanguageType DeclContextGetLanguage(void *opaque_decl_ctx) override { + return lldb::LanguageType::eLanguageTypeUnknown; + } + +// Tests +#ifndef NDEBUG + /// Verify the integrity of the type to catch CompilerTypes that mix + /// and match invalid TypeSystem/Opaque type pairs. + bool Verify(lldb::opaque_compiler_type_t type) { return false; }; +#endif + + bool IsArrayType(lldb::opaque_compiler_type_t type, + CompilerType *element_type, uint64_t *size, + bool *is_incomplete) override { + return false; + }; + + bool IsAggregateType(lldb::opaque_compiler_type_t type) override { + return false; + } + + bool IsCharType(lldb::opaque_compiler_type_t type) override { return false; } + + bool IsCompleteType(lldb::opaque_compiler_type_t type) override { + return false; + } + + bool IsDefined(lldb::opaque_compiler_type_t type) override { return false; } + + bool IsFloatingPointType(lldb::opaque_compiler_type_t type) override { + return false; + } + + bool IsFunctionType(lldb::opaque_compiler_type_t type) override { + return false; + } + + size_t + GetNumberOfFunctionArguments(lldb::opaque_compiler_type_t type) override { + return 0; + } + + CompilerType GetFunctionArgumentAtIndex(lldb::opaque_compiler_type_t type, + const size_t index) override { + return CompilerType(); + } + + bool IsFunctionPointerType(lldb::opaque_compiler_type_t type) override { + return false; + } + + bool IsMemberFunctionPointerType(lldb::opaque_compiler_type_t type) override { + return false; + } + + bool IsMemberDataPointerType(lldb::opaque_compiler_type_t type) override { + return false; + } + + bool IsBlockPointerType(lldb::opaque_compiler_type_t type, + CompilerType *function_pointer_type_ptr) override { + return false; + } + + bool IsIntegerType(lldb::opaque_compiler_type_t type, + bool &is_signed) override { + return false; + }; + + bool IsScopedEnumerationType(lldb::opaque_compiler_type_t type) override { + return false; + } + + bool IsPossibleDynamicType(lldb::opaque_compiler_type_t type, + CompilerType *target_type, // Can pass NULL + bool check_cplusplus, bool check_objc) override { + return false; + } + + bool IsPointerType(lldb::opaque_compiler_type_t type, + CompilerType *pointee_type) override { + return false; + } + + bool IsScalarType(lldb::opaque_compiler_type_t type) override { + return false; + } + + bool IsVoidType(lldb::opaque_compiler_type_t type) override { return false; } + + bool CanPassInRegisters(const CompilerType &type) override { return false; } + + // TypeSystems can support more than one language + bool SupportsLanguage(lldb::LanguageType language) override { + if (language == lldb::LanguageType::eLanguageTypeFortran77 || + language == lldb::LanguageType::eLanguageTypeFortran90 || + language == lldb::LanguageType::eLanguageTypeFortran95 || + language == lldb::LanguageType::eLanguageTypeFortran03 || + language == lldb::LanguageType::eLanguageTypeFortran08 || + language == lldb::LanguageType::eLanguageTypeFortran18) { + return true; + } + return false; + } + + llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } + + static llvm::StringRef GetPluginNameStatic() { return "fortran"; } + + // Type Completion + + bool GetCompleteType(lldb::opaque_compiler_type_t type) override { + return false; + } + + // AST related queries + + uint32_t GetPointerByteSize() override { return 0; } + + CompilerType GetPointerDiffType(bool is_signed) override { + return CompilerType(); + } + + unsigned GetPtrAuthKey(lldb::opaque_compiler_type_t type) override { + return 0; + } + + unsigned GetPtrAuthDiscriminator(lldb::opaque_compiler_type_t type) override { + return 0; + } + + bool GetPtrAuthAddressDiversity(lldb::opaque_compiler_type_t type) override { + return false; + } + + // Accessors + + ConstString GetTypeName(lldb::opaque_compiler_type_t type, + bool BaseOnly) override { + return ConstString(); + } + + ConstString GetDisplayTypeName(lldb::opaque_compiler_type_t type) override { + return ConstString(); + } + + uint32_t + GetTypeInfo(lldb::opaque_compiler_type_t type, + CompilerType *pointee_or_element_compiler_type) override { + return 0; + } + + lldb::LanguageType + GetMinimumLanguage(lldb::opaque_compiler_type_t type) override { + return lldb::LanguageType::eLanguageTypeUnknown; + } + + lldb::TypeClass GetTypeClass(lldb::opaque_compiler_type_t type) override { + return lldb::TypeClass::eTypeClassInvalid; + } + + // Creating related types + + CompilerType GetArrayElementType(lldb::opaque_compiler_type_t type, + ExecutionContextScope *exe_scope) override { + return CompilerType(); + } + + CompilerType GetCanonicalType(lldb::opaque_compiler_type_t type) override { + return CompilerType(); + } + + CompilerType + GetEnumerationIntegerType(lldb::opaque_compiler_type_t type) override { + return CompilerType(); + } + + // Returns -1 if this isn't a function of if the function doesn't have a + // prototype Returns a value >= 0 if there is a prototype. + int GetFunctionArgumentCount(lldb::opaque_compiler_type_t type) override { + return -1; + } + + CompilerType GetFunctionArgumentTypeAtIndex(lldb::opaque_compiler_type_t type, + size_t idx) override { + return CompilerType(); + } + + CompilerType + GetFunctionReturnType(lldb::opaque_compiler_type_t type) override { + return CompilerType(); + } + + size_t GetNumMemberFunctions(lldb::opaque_compiler_type_t type) override { + return 0; + } + + TypeMemberFunctionImpl + GetMemberFunctionAtIndex(lldb::opaque_compiler_type_t type, + size_t idx) override { + return TypeMemberFunctionImpl(); + } + + CompilerType GetPointeeType(lldb::opaque_compiler_type_t type) override { + return CompilerType(); + } + + CompilerType GetPointerType(lldb::opaque_compiler_type_t type) override { + return CompilerType(); + } + + // Exploring the type + + const llvm::fltSemantics & + GetFloatTypeSemantics(size_t byte_size, lldb::Format format) override { + return llvm::APFloatBase::Bogus(); + } + + llvm::Expected<uint64_t> + GetBitSize(lldb::opaque_compiler_type_t type, + ExecutionContextScope *exe_scope) override { + return 0; + } + + lldb::Encoding GetEncoding(lldb::opaque_compiler_type_t type) override { + return lldb::eEncodingInvalid; + } + + lldb::Format GetFormat(lldb::opaque_compiler_type_t type) override { + return lldb::eFormatDefault; + } + + llvm::Expected<uint32_t> + GetNumChildren(lldb::opaque_compiler_type_t type, + bool omit_empty_base_classes, + const ExecutionContext *exe_ctx) override { + return 0; + } + + lldb::BasicType + GetBasicTypeEnumeration(lldb::opaque_compiler_type_t type) override { + return lldb::eBasicTypeUnsignedInt; + } + + uint32_t GetNumFields(lldb::opaque_compiler_type_t type) override { + return 0; + } + + CompilerType GetFieldAtIndex(lldb::opaque_compiler_type_t type, size_t idx, + std::string &name, uint64_t *bit_offset_ptr, + uint32_t *bitfield_bit_size_ptr, + bool *is_bitfield_ptr) override { + return CompilerType(); + } + + uint32_t GetNumDirectBaseClasses(lldb::opaque_compiler_type_t type) override { + return 0; + } + + uint32_t + GetNumVirtualBaseClasses(lldb::opaque_compiler_type_t type) override { + return 0; + } + + CompilerType GetDirectBaseClassAtIndex(lldb::opaque_compiler_type_t type, + size_t idx, + uint32_t *bit_offset_ptr) override { + return CompilerType(); + } + + CompilerType GetVirtualBaseClassAtIndex(lldb::opaque_compiler_type_t type, + size_t idx, + uint32_t *bit_offset_ptr) override { + return CompilerType(); + } + + llvm::Expected<CompilerType> + GetDereferencedType(lldb::opaque_compiler_type_t type, + ExecutionContext *exe_ctx, std::string &deref_name, + uint32_t &deref_byte_size, int32_t &deref_byte_offset, + ValueObject *valobj, uint64_t &language_flags) override { + return CompilerType(); + } + + llvm::Expected<CompilerType> GetChildCompilerTypeAtIndex( + lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx, size_t idx, + bool transparent_pointers, bool omit_empty_base_classes, + bool ignore_array_bounds, std::string &child_name, + uint32_t &child_byte_size, int32_t &child_byte_offset, + uint32_t &child_bitfield_bit_size, uint32_t &child_bitfield_bit_offset, + bool &child_is_base_class, bool &child_is_deref_of_parent, + ValueObject *valobj, uint64_t &language_flags) override { + return CompilerType(); + } + + // Lookup a child given a name. This function will match base class names and + // member member names in "clang_type" only, not descendants. + llvm::Expected<uint32_t> + GetIndexOfChildWithName(lldb::opaque_compiler_type_t type, + llvm::StringRef name, + bool omit_empty_base_classes) override { + return 0; + } + + size_t + GetIndexOfChildMemberWithName(lldb::opaque_compiler_type_t type, + llvm::StringRef name, + bool omit_empty_base_classes, + std::vector<uint32_t> &child_indexes) override { + return 0; + } + +#ifndef NDEBUG + /// Convenience LLVM-style dump method for use in the debugger only. + LLVM_DUMP_METHOD void dump(lldb::opaque_compiler_type_t type) const override { + } +#endif + + bool DumpTypeValue(lldb::opaque_compiler_type_t type, Stream &s, + lldb::Format format, const DataExtractor &data, + lldb::offset_t data_offset, size_t data_byte_size, + uint32_t bitfield_bit_size, uint32_t bitfield_bit_offset, + ExecutionContextScope *exe_scope) override { + return false; + } + + /// Dump the type to stdout. + void DumpTypeDescription( + lldb::opaque_compiler_type_t type, + lldb::DescriptionLevel level = lldb::eDescriptionLevelFull) override {} + + /// Print a description of the type to a stream. The exact implementation + /// varies, but the expectation is that eDescriptionLevelFull returns a + /// source-like representation of the type, whereas eDescriptionLevelVerbose + /// does a dump of the underlying AST if applicable. + void DumpTypeDescription( + lldb::opaque_compiler_type_t type, Stream &s, + lldb::DescriptionLevel level = lldb::eDescriptionLevelFull) override {} + + /// Dump a textual representation of the internal TypeSystem state to the + /// given stream. + /// + /// This should not modify the state of the TypeSystem if possible. + /// + /// \param[out] output Stream to dup the AST into. + /// \param[in] filter If empty, dump whole AST. If non-empty, will only + /// dump decls whose names contain \c filter. + /// \param[in] show_color If true, prints the AST color-highlighted. + void Dump(llvm::raw_ostream &output, llvm::StringRef filter, + bool show_color) override {} + + /// This is used by swift. + bool IsRuntimeGeneratedType(lldb::opaque_compiler_type_t type) override { + return false; + } + + // TODO: Determine if these methods should move to TypeSystemClang. + + bool IsPointerOrReferenceType(lldb::opaque_compiler_type_t type, + CompilerType *pointee_type) override { + return false; + } + + unsigned GetTypeQualifiers(lldb::opaque_compiler_type_t type) override { + return 0; + } + + std::optional<size_t> + GetTypeBitAlign(lldb::opaque_compiler_type_t type, + ExecutionContextScope *exe_scope) override { + return 0; + } + + CompilerType GetBasicTypeFromAST(lldb::BasicType basic_type) override { + return CompilerType(); + } + + CompilerType GetBuiltinTypeForEncodingAndBitSize(lldb::Encoding encoding, + size_t bit_size) override { + return CompilerType(); + } + + bool IsBeingDefined(lldb::opaque_compiler_type_t type) override { + return false; + } + + bool IsConst(lldb::opaque_compiler_type_t type) override { return false; } + + uint32_t IsHomogeneousAggregate(lldb::opaque_compiler_type_t type, + CompilerType *base_type_ptr) override { + return 0; + } + + bool IsPolymorphicClass(lldb::opaque_compiler_type_t type) override { + return false; + } + + bool IsTypedefType(lldb::opaque_compiler_type_t type) override { + return false; + } + + // If the current object represents a typedef type, get the underlying type + CompilerType GetTypedefedType(lldb::opaque_compiler_type_t type) override { + return CompilerType(); + } + + bool IsVectorType(lldb::opaque_compiler_type_t type, + CompilerType *element_type, uint64_t *size) override { + return false; + } + + CompilerType + GetFullyUnqualifiedType(lldb::opaque_compiler_type_t type) override { + return CompilerType(); + } + + CompilerType GetNonReferenceType(lldb::opaque_compiler_type_t type) override { + return CompilerType(); + } + // TODO + bool IsReferenceType(lldb::opaque_compiler_type_t type, + CompilerType *pointee_type, bool *is_rvalue) override { + return false; + } + +private: + // LLVM RTTI support + static char ID; +}; +} // namespace lldb_private +#endif // LLDB_SOURCE_PLUGINS_TYPESYSTEM_FORTRAN_TYPESYSTEMFORTRAN_H >From 21ff578224ae5c189aaa9a456948fc8f9dd2bf29 Mon Sep 17 00:00:00 2001 From: Iasonaskrpr <[email protected]> Date: Sat, 9 May 2026 20:14:29 +0300 Subject: [PATCH 2/9] [lldb] Added Fortran language Plugin --- lldb/include/lldb/Target/Language.h | 2 + lldb/source/Plugins/Language/CMakeLists.txt | 1 + .../Plugins/Language/Fortran/CMakeLists.txt | 12 ++++ .../Language/Fortran/FortranLanguage.cpp | 60 +++++++++++++++++++ .../Language/Fortran/FortranLanguage.h | 53 ++++++++++++++++ lldb/source/Target/Language.cpp | 14 +++++ 6 files changed, 142 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 diff --git a/lldb/include/lldb/Target/Language.h b/lldb/include/lldb/Target/Language.h index bd3faf89658c9..5c7bdfcc628ce 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..7c5faa87aeaba --- /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 +) \ No newline at end of file diff --git a/lldb/source/Plugins/Language/Fortran/FortranLanguage.cpp b/lldb/source/Plugins/Language/Fortran/FortranLanguage.cpp new file mode 100644 index 0000000000000..a7040ae337b17 --- /dev/null +++ b/lldb/source/Plugins/Language/Fortran/FortranLanguage.cpp @@ -0,0 +1,60 @@ +//===-- FortranLanguage.cpp -----------------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "llvm/ADT/StringRef.h" + +#include "FortranLanguage.h" + +#include "lldb/Core/PluginManager.h" + +#include "Plugins/TypeSystem/Fortran/TypeSystemFortran.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) { + // FIXME: Should Fortran 77 be supported??? + if (Language::LanguageIsFortran(language)) { + return new FortranLanguage(); + } + return nullptr; +} + +bool FortranLanguage::IsSourceFile(StringRef file_path) const { + const auto suffixes = {".f90", ".f"}; + 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..1116564e96c7a --- /dev/null +++ b/lldb/source/Plugins/Language/Fortran/FortranLanguage.h @@ -0,0 +1,53 @@ +//===-- FortranLanguage.h -------------------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#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 \ No newline at end of file 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: >From 386586dbecd885e22d2a729dd3d7d506b3491728 Mon Sep 17 00:00:00 2001 From: Iasonaskrpr <[email protected]> Date: Thu, 14 May 2026 23:20:53 +0300 Subject: [PATCH 3/9] [lldb][Fortran] Added TypeSystemFortran to lldb-forward declarations --- lldb/include/lldb/lldb-forward.h | 1 + 1 file changed, 1 insertion(+) diff --git a/lldb/include/lldb/lldb-forward.h b/lldb/include/lldb/lldb-forward.h index 67888f7d32ed1..9c6a11dd6d9b3 100644 --- a/lldb/include/lldb/lldb-forward.h +++ b/lldb/include/lldb/lldb-forward.h @@ -282,6 +282,7 @@ class TypeSummaryImpl; class TypeSummaryOptions; class TypeSystem; class TypeSystemClang; +class TypeSystemFortran; class UUID; class UnixSignals; class Unwind; >From 892418722a475697f0f7ef597806b758f4526fe0 Mon Sep 17 00:00:00 2001 From: Iasonaskrpr <[email protected]> Date: Tue, 9 Jun 2026 15:11:19 +0300 Subject: [PATCH 4/9] [lldb][Fortran] Added plugin registration tests for Fortran --- lldb/unittests/Language/CMakeLists.txt | 1 + .../unittests/Language/Fortran/CMakeLists.txt | 6 ++++ .../Language/Fortran/FortranLanguageTest.cpp | 36 +++++++++++++++++++ 3 files changed, 43 insertions(+) create mode 100644 lldb/unittests/Language/Fortran/CMakeLists.txt create mode 100644 lldb/unittests/Language/Fortran/FortranLanguageTest.cpp 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..0b5e9b9e43818 --- /dev/null +++ b/lldb/unittests/Language/Fortran/FortranLanguageTest.cpp @@ -0,0 +1,36 @@ +//===-- FortranLanguagesTest.cpp ------------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#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) { + Language *language_plugin = Language::FindPlugin(language); + if (language_plugin) + 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"); +} >From 1666320b8e3032a38af239462583020a8ff1210f Mon Sep 17 00:00:00 2001 From: Iasonaskrpr <[email protected]> Date: Sat, 27 Jun 2026 15:27:54 +0300 Subject: [PATCH 5/9] [lldb][Fortran] Finalized lldb plugin skeleton --- .../DWARF/DWARFASTParserFortran.cpp | 7 +- .../SymbolFile/DWARF/DWARFASTParserFortran.h | 2 +- .../TypeSystem/Fortran/TypeSystemFortran.cpp | 87 +++++++++++++++++++ .../TypeSystem/Fortran/TypeSystemFortran.h | 38 ++++---- 4 files changed, 114 insertions(+), 20 deletions(-) diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserFortran.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserFortran.cpp index 0973f658f6b04..2b9267f26612f 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserFortran.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserFortran.cpp @@ -12,7 +12,7 @@ using namespace lldb; using namespace lldb_private; DWARFASTParserFortran::DWARFASTParserFortran( - lldb_private::TypeSystemFortran m_ast) + lldb_private::TypeSystemFortran &m_ast) : lldb_private::plugin::dwarf::DWARFASTParser(Kind::DWARFASTParserFortran), m_ast(m_ast) {} @@ -21,19 +21,18 @@ DWARFASTParserFortran::~DWARFASTParserFortran() {} lldb::TypeSP DWARFASTParserFortran::ParseTypeFromDWARF( const lldb_private::SymbolContext &sc, const lldb_private::plugin::dwarf::DWARFDIE &die, bool *type_is_new_ptr) { - // TODO + return lldb::TypeSP(); } lldb_private::Function *DWARFASTParserFortran::ParseFunctionFromDWARF( lldb_private::CompileUnit &comp_unit, const lldb_private::plugin::dwarf::DWARFDIE &die, lldb_private::AddressRanges ranges) { - // TODO + return nullptr; } bool DWARFASTParserFortran::CompleteTypeFromDWARF( const lldb_private::plugin::dwarf::DWARFDIE &die, lldb_private::Type *type, const lldb_private::CompilerType &compiler_type) { - // TODO return false; } diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserFortran.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserFortran.h index 6b26c798d190b..a688a8e810118 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserFortran.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserFortran.h @@ -21,7 +21,7 @@ class ExecutionContext; class DWARFASTParserFortran : public lldb_private::plugin::dwarf::DWARFASTParser { public: - DWARFASTParserFortran(lldb_private::TypeSystemFortran m_ast); + DWARFASTParserFortran(lldb_private::TypeSystemFortran &m_ast); ~DWARFASTParserFortran() override; diff --git a/lldb/source/Plugins/TypeSystem/Fortran/TypeSystemFortran.cpp b/lldb/source/Plugins/TypeSystem/Fortran/TypeSystemFortran.cpp index e69de29bb2d1d..7b6da8a77009d 100644 --- a/lldb/source/Plugins/TypeSystem/Fortran/TypeSystemFortran.cpp +++ b/lldb/source/Plugins/TypeSystem/Fortran/TypeSystemFortran.cpp @@ -0,0 +1,87 @@ +//===-- TypeSystemFortran.cpp -----------------------------------*- C++ -*-===// +// +// 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 +// +//===----------------------------------------------------------------------===// +#include "TypeSystemFortran.h" + +#include "lldb/Core/PluginManager.h" +#include "lldb/Symbol/SymbolFile.h" +#include "lldb/Target/Target.h" + +#include "Plugins/SymbolFile/DWARF/DWARFASTParserFortran.h" + +using namespace lldb; +using namespace lldb_private; +using namespace llvm; +using namespace lldb_private::plugin::dwarf; + +LLDB_PLUGIN_DEFINE(TypeSystemFortran) + +/// Used to determine if TypeSystem supports the language passed in +/// CreateInstance +static bool IsLanguageSupported(lldb::LanguageType language) { + if (language == lldb::LanguageType::eLanguageTypeFortran77 || + language == lldb::LanguageType::eLanguageTypeFortran90 || + language == lldb::LanguageType::eLanguageTypeFortran95 || + language == lldb::LanguageType::eLanguageTypeFortran03 || + language == lldb::LanguageType::eLanguageTypeFortran08 || + language == lldb::LanguageType::eLanguageTypeFortran18) + return true; + + return false; +} + +char TypeSystemFortran::ID; + +TypeSystemFortran::~TypeSystemFortran() = default; +TypeSystemFortran::TypeSystemFortran() = default; + +void TypeSystemFortran::Initialize() { + PluginManager::RegisterPlugin( + GetPluginNameStatic(), "fortran AST context plug-in", CreateInstance, + GetSupportedLanguagesForTypes(), GetSupportedLanguagesForExpressions()); +} + +void TypeSystemFortran::Terminate() { + PluginManager::UnregisterPlugin(CreateInstance); +} + +plugin::dwarf::DWARFASTParser *TypeSystemFortran::GetDWARFParser() { + if (!m_dwarf_ast_parser_up) + m_dwarf_ast_parser_up = std::make_unique<DWARFASTParserFortran>(*this); + return m_dwarf_ast_parser_up.get(); +} + +// TODO: Process Target and architecture for pointers and Expression Evaluation, +// if module and target have different typesystems like clang, we would have to +// account for that here +lldb::TypeSystemSP +TypeSystemFortran::CreateInstance(lldb::LanguageType language, Module *module, + Target *target) { + if (IsLanguageSupported(language)) { + return std::make_shared<TypeSystemFortran>(); + } + return TypeSystemSP(); +} + +LanguageSet TypeSystemFortran::GetSupportedLanguagesForTypes() { + LanguageSet languages; + languages.Insert(eLanguageTypeFortran77); + languages.Insert(eLanguageTypeFortran90); + languages.Insert(eLanguageTypeFortran95); + languages.Insert(eLanguageTypeFortran03); + languages.Insert(eLanguageTypeFortran08); + languages.Insert(eLanguageTypeFortran18); + return languages; +} + +LanguageSet TypeSystemFortran::GetSupportedLanguagesForExpressions() { + return GetSupportedLanguagesForTypes(); +} + +bool TypeSystemFortran::SupportsLanguage(lldb::LanguageType language) { + return IsLanguageSupported(language); +} \ No newline at end of file diff --git a/lldb/source/Plugins/TypeSystem/Fortran/TypeSystemFortran.h b/lldb/source/Plugins/TypeSystem/Fortran/TypeSystemFortran.h index be1844a16853c..bf68cea4553c2 100644 --- a/lldb/source/Plugins/TypeSystem/Fortran/TypeSystemFortran.h +++ b/lldb/source/Plugins/TypeSystem/Fortran/TypeSystemFortran.h @@ -13,7 +13,10 @@ namespace lldb_private { class TypeSystemFortran : public TypeSystem { + // LLVM RTTI support + static char ID; +public: // llvm casting support bool isA(const void *ClassID) const override { return ClassID == &ID; } static bool classof(const TypeSystem *ts) { return ts->isA(&ID); } @@ -21,6 +24,19 @@ class TypeSystemFortran : public TypeSystem { TypeSystemFortran(); ~TypeSystemFortran(); + static void Initialize(); + + static void Terminate(); + + plugin::dwarf::DWARFASTParser *GetDWARFParser() override; + + static lldb::TypeSystemSP CreateInstance(lldb::LanguageType language, + Module *module, Target *target); + + static LanguageSet GetSupportedLanguagesForTypes(); + + static LanguageSet GetSupportedLanguagesForExpressions(); + // CompilerDecl functions ConstString DeclGetName(void *opaque_decl) override { return ConstString(); } @@ -55,7 +71,7 @@ class TypeSystemFortran : public TypeSystem { #ifndef NDEBUG /// Verify the integrity of the type to catch CompilerTypes that mix /// and match invalid TypeSystem/Opaque type pairs. - bool Verify(lldb::opaque_compiler_type_t type) { return false; }; + bool Verify(lldb::opaque_compiler_type_t type) override { return false; }; #endif bool IsArrayType(lldb::opaque_compiler_type_t type, @@ -140,17 +156,7 @@ class TypeSystemFortran : public TypeSystem { bool CanPassInRegisters(const CompilerType &type) override { return false; } // TypeSystems can support more than one language - bool SupportsLanguage(lldb::LanguageType language) override { - if (language == lldb::LanguageType::eLanguageTypeFortran77 || - language == lldb::LanguageType::eLanguageTypeFortran90 || - language == lldb::LanguageType::eLanguageTypeFortran95 || - language == lldb::LanguageType::eLanguageTypeFortran03 || - language == lldb::LanguageType::eLanguageTypeFortran08 || - language == lldb::LanguageType::eLanguageTypeFortran18) { - return true; - } - return false; - } + bool SupportsLanguage(lldb::LanguageType language) override; llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } @@ -201,7 +207,7 @@ class TypeSystemFortran : public TypeSystem { lldb::LanguageType GetMinimumLanguage(lldb::opaque_compiler_type_t type) override { - return lldb::LanguageType::eLanguageTypeUnknown; + return lldb::LanguageType::eLanguageTypeFortran90; } lldb::TypeClass GetTypeClass(lldb::opaque_compiler_type_t type) override { @@ -473,8 +479,10 @@ class TypeSystemFortran : public TypeSystem { } private: - // LLVM RTTI support - static char ID; + std::unique_ptr<plugin::dwarf::DWARFASTParser> m_dwarf_ast_parser_up; + + TypeSystemFortran(const TypeSystemFortran &) = delete; + const TypeSystemFortran &operator=(const TypeSystemFortran &) = delete; }; } // namespace lldb_private #endif // LLDB_SOURCE_PLUGINS_TYPESYSTEM_FORTRAN_TYPESYSTEMFORTRAN_H >From 74bab4e14b23e5478924e6af29cae7a647b5f6bc Mon Sep 17 00:00:00 2001 From: Iasonaskrpr <[email protected]> Date: Sat, 27 Jun 2026 15:50:19 +0300 Subject: [PATCH 6/9] [lldb][Fortran] Added variable guard to Fortran Plugin --- lldb/source/Plugins/Language/CMakeLists.txt | 4 +++- .../Plugins/SymbolFile/DWARF/CMakeLists.txt | 16 +++++++++++++--- lldb/source/Plugins/TypeSystem/CMakeLists.txt | 5 ++++- lldb/unittests/Language/CMakeLists.txt | 4 +++- 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/lldb/source/Plugins/Language/CMakeLists.txt b/lldb/source/Plugins/Language/CMakeLists.txt index 5377734af2f8d..bdecd0bf2a6a3 100644 --- a/lldb/source/Plugins/Language/CMakeLists.txt +++ b/lldb/source/Plugins/Language/CMakeLists.txt @@ -7,4 +7,6 @@ set_property(DIRECTORY PROPERTY LLDB_TOLERATED_PLUGIN_DEPENDENCIES add_subdirectory(CPlusPlus) add_subdirectory(ObjC) add_subdirectory(ObjCPlusPlus) -add_subdirectory(Fortran) +if("flang" IN_LIST LLVM_ENABLE_PROJECTS OR "all" IN_LIST LLVM_ENABLE_PROJECTS) + add_subdirectory(Fortran) +endif() \ No newline at end of file diff --git a/lldb/source/Plugins/SymbolFile/DWARF/CMakeLists.txt b/lldb/source/Plugins/SymbolFile/DWARF/CMakeLists.txt index b198ec4e99b24..027cad4cbdd6f 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/CMakeLists.txt +++ b/lldb/source/Plugins/SymbolFile/DWARF/CMakeLists.txt @@ -16,7 +16,6 @@ add_lldb_library(lldbPluginSymbolFileDWARF PLUGIN DIERef.cpp DWARFASTParser.cpp DWARFASTParserClang.cpp - DWARFASTParserFortran.cpp DWARFAttribute.cpp DWARFBaseDIE.cpp DWARFCompileUnit.cpp @@ -58,9 +57,7 @@ add_lldb_library(lldbPluginSymbolFileDWARF PLUGIN lldbPluginObjCLanguage lldbPluginCPlusPlusLanguage lldbPluginExpressionParserClang - lldbPluginFortranLanguage lldbPluginTypeSystemClang - lldbPluginTypeSystemFortran CLANG_LIBS clangAST clangBasic @@ -69,3 +66,16 @@ add_lldb_library(lldbPluginSymbolFileDWARF PLUGIN add_dependencies(lldbPluginSymbolFileDWARF LLDBPluginSymbolFileDWARFPropertiesGen LLDBPluginSymbolFileDWARFPropertiesEnumGen) + +if("flang" IN_LIST LLVM_ENABLE_PROJECTS OR "all" IN_LIST LLVM_ENABLE_PROJECTS) + + target_sources(lldbPluginSymbolFileDWARF PRIVATE + DWARFASTParserFortran.cpp + ) + + target_link_libraries(lldbPluginSymbolFileDWARF PRIVATE + lldbPluginFortranLanguage + lldbPluginTypeSystemFortran + ) + +endif() diff --git a/lldb/source/Plugins/TypeSystem/CMakeLists.txt b/lldb/source/Plugins/TypeSystem/CMakeLists.txt index 24431c14fca61..3128f207eaee3 100644 --- a/lldb/source/Plugins/TypeSystem/CMakeLists.txt +++ b/lldb/source/Plugins/TypeSystem/CMakeLists.txt @@ -3,4 +3,7 @@ set_property(DIRECTORY PROPERTY LLDB_PLUGIN_KIND TypeSystem) set_property(DIRECTORY PROPERTY LLDB_TOLERATED_PLUGIN_DEPENDENCIES SymbolFile) add_subdirectory(Clang) -add_subdirectory(Fortran) \ No newline at end of file + +if("flang" IN_LIST LLVM_ENABLE_PROJECTS OR "all" IN_LIST LLVM_ENABLE_PROJECTS) + add_subdirectory(Fortran) +endif() \ No newline at end of file diff --git a/lldb/unittests/Language/CMakeLists.txt b/lldb/unittests/Language/CMakeLists.txt index 26710ff8896e2..d23dec58328be 100644 --- a/lldb/unittests/Language/CMakeLists.txt +++ b/lldb/unittests/Language/CMakeLists.txt @@ -1,4 +1,6 @@ add_subdirectory(CPlusPlus) add_subdirectory(CLanguages) add_subdirectory(ObjC) -add_subdirectory(Fortran) +if("flang" IN_LIST LLVM_ENABLE_PROJECTS OR "all" IN_LIST LLVM_ENABLE_PROJECTS) + add_subdirectory(Fortran) +endif() \ No newline at end of file >From 5f7cd48bdbb0cadd25fda3166a1405498bcbd4c2 Mon Sep 17 00:00:00 2001 From: Iasonaskrpr <[email protected]> Date: Sun, 28 Jun 2026 19:02:22 +0300 Subject: [PATCH 7/9] [lldb][Fortran] Added FindFlang module and updated CMAKE flag guarding for Fortran support in lldb --- lldb/cmake/modules/FindFlang.cmake | 17 +++++++++++++++++ lldb/cmake/modules/LLDBConfig.cmake | 1 + lldb/source/Plugins/Language/CMakeLists.txt | 2 +- .../Plugins/SymbolFile/DWARF/CMakeLists.txt | 16 +++++++++------- lldb/source/Plugins/TypeSystem/CMakeLists.txt | 2 +- lldb/unittests/Language/CMakeLists.txt | 2 +- 6 files changed, 30 insertions(+), 10 deletions(-) create mode 100644 lldb/cmake/modules/FindFlang.cmake diff --git a/lldb/cmake/modules/FindFlang.cmake b/lldb/cmake/modules/FindFlang.cmake new file mode 100644 index 0000000000000..f71d42c5fb586 --- /dev/null +++ b/lldb/cmake/modules/FindFlang.cmake @@ -0,0 +1,17 @@ +# FindFlang.cmake + +include(FindPackageHandleStandardArgs) + +# If Flang and lldb are in-tree then the libraries will already be available, otherwise look for specific directories +if(TARGET flangFrontEnd) + set(Flang_FOUND TRUE) +else() + find_package(Flang QUIET CONFIG HINTS ${Flang_DIR} ${LLVM_DIR}/../flang) +endif() + +find_package_handle_standard_args(Flang + FOUND_VAR + Flang_FOUND + REQUIRED_VARS + Flang_FOUND +) \ No newline at end of file diff --git a/lldb/cmake/modules/LLDBConfig.cmake b/lldb/cmake/modules/LLDBConfig.cmake index e086aaf5d3632..82ad8b19ebb79 100644 --- a/lldb/cmake/modules/LLDBConfig.cmake +++ b/lldb/cmake/modules/LLDBConfig.cmake @@ -64,6 +64,7 @@ add_optional_dependency(LLDB_ENABLE_LUA "Enable Lua scripting support in LLDB" L add_optional_dependency(LLDB_ENABLE_PYTHON "Enable Python scripting support in LLDB" PythonAndSwig PYTHONANDSWIG_FOUND) add_optional_dependency(LLDB_ENABLE_LIBXML2 "Enable Libxml 2 support in LLDB" LibXml2 LIBXML2_FOUND VERSION ${LLDB_LIBXML2_VERSION}) add_optional_dependency(LLDB_ENABLE_TREESITTER "Enable Tree-sitter syntax highlighting" TreeSitter TREESITTER_FOUND) +add_optional_dependency(LLDB_ENABLE_FORTRAN "Enable Fortran support in lldb" Flang Flang_FOUND) option(LLDB_USE_ENTITLEMENTS "When codesigning, use entitlements if available" ON) option(LLDB_BUILD_FRAMEWORK "Build LLDB.framework (Darwin only)" OFF) diff --git a/lldb/source/Plugins/Language/CMakeLists.txt b/lldb/source/Plugins/Language/CMakeLists.txt index bdecd0bf2a6a3..2dd89b5207a57 100644 --- a/lldb/source/Plugins/Language/CMakeLists.txt +++ b/lldb/source/Plugins/Language/CMakeLists.txt @@ -7,6 +7,6 @@ set_property(DIRECTORY PROPERTY LLDB_TOLERATED_PLUGIN_DEPENDENCIES add_subdirectory(CPlusPlus) add_subdirectory(ObjC) add_subdirectory(ObjCPlusPlus) -if("flang" IN_LIST LLVM_ENABLE_PROJECTS OR "all" IN_LIST LLVM_ENABLE_PROJECTS) +if(LLDB_ENABLE_FORTRAN) add_subdirectory(Fortran) endif() \ No newline at end of file diff --git a/lldb/source/Plugins/SymbolFile/DWARF/CMakeLists.txt b/lldb/source/Plugins/SymbolFile/DWARF/CMakeLists.txt index 027cad4cbdd6f..dcaf1c2df2b19 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/CMakeLists.txt +++ b/lldb/source/Plugins/SymbolFile/DWARF/CMakeLists.txt @@ -10,6 +10,13 @@ lldb_tablegen(SymbolFileDWARFProperties.json -dump-json SOURCE SymbolFileDWARFProperties.td TARGET LLDBPluginSymbolFileDWARFPropertiesJsonGen) +set(LLVM_OPTIONAL_SOURCES DWARFASTParserFortran.cpp) + +set(FORTRAN_DWARF_SOURCES "") +if(LLDB_ENABLE_FORTRAN) + set(FORTRAN_DWARF_SOURCES DWARFASTParserFortran.cpp) +endif() + add_lldb_library(lldbPluginSymbolFileDWARF PLUGIN AppleDWARFIndex.cpp DebugNamesDWARFIndex.cpp @@ -41,6 +48,7 @@ add_lldb_library(lldbPluginSymbolFileDWARF PLUGIN SymbolFileDWARFDebugMap.cpp SymbolFileWasm.cpp UniqueDWARFASTType.cpp + ${FORTRAN_DWARF_SOURCES} LINK_COMPONENTS DebugInfoDWARF @@ -67,15 +75,9 @@ add_dependencies(lldbPluginSymbolFileDWARF LLDBPluginSymbolFileDWARFPropertiesGen LLDBPluginSymbolFileDWARFPropertiesEnumGen) -if("flang" IN_LIST LLVM_ENABLE_PROJECTS OR "all" IN_LIST LLVM_ENABLE_PROJECTS) - - target_sources(lldbPluginSymbolFileDWARF PRIVATE - DWARFASTParserFortran.cpp - ) - +if(LLDB_ENABLE_FORTRAN) target_link_libraries(lldbPluginSymbolFileDWARF PRIVATE lldbPluginFortranLanguage lldbPluginTypeSystemFortran ) - endif() diff --git a/lldb/source/Plugins/TypeSystem/CMakeLists.txt b/lldb/source/Plugins/TypeSystem/CMakeLists.txt index 3128f207eaee3..7342c5a8af639 100644 --- a/lldb/source/Plugins/TypeSystem/CMakeLists.txt +++ b/lldb/source/Plugins/TypeSystem/CMakeLists.txt @@ -4,6 +4,6 @@ set_property(DIRECTORY PROPERTY LLDB_TOLERATED_PLUGIN_DEPENDENCIES SymbolFile) add_subdirectory(Clang) -if("flang" IN_LIST LLVM_ENABLE_PROJECTS OR "all" IN_LIST LLVM_ENABLE_PROJECTS) +if(LLDB_ENABLE_FORTRAN) add_subdirectory(Fortran) endif() \ No newline at end of file diff --git a/lldb/unittests/Language/CMakeLists.txt b/lldb/unittests/Language/CMakeLists.txt index d23dec58328be..db43874757bc3 100644 --- a/lldb/unittests/Language/CMakeLists.txt +++ b/lldb/unittests/Language/CMakeLists.txt @@ -1,6 +1,6 @@ add_subdirectory(CPlusPlus) add_subdirectory(CLanguages) add_subdirectory(ObjC) -if("flang" IN_LIST LLVM_ENABLE_PROJECTS OR "all" IN_LIST LLVM_ENABLE_PROJECTS) +if(LLDB_ENABLE_FORTRAN) add_subdirectory(Fortran) endif() \ No newline at end of file >From 122a48c1885b7eb18f0a8eb3ea000ac2eca8731c Mon Sep 17 00:00:00 2001 From: Iasonaskrpr <[email protected]> Date: Fri, 17 Jul 2026 19:02:42 +0300 Subject: [PATCH 8/9] [lldb] Removed CMake changes --- lldb/cmake/modules/FindFlang.cmake | 17 ----------------- lldb/cmake/modules/LLDBConfig.cmake | 1 - 2 files changed, 18 deletions(-) delete mode 100644 lldb/cmake/modules/FindFlang.cmake diff --git a/lldb/cmake/modules/FindFlang.cmake b/lldb/cmake/modules/FindFlang.cmake deleted file mode 100644 index f71d42c5fb586..0000000000000 --- a/lldb/cmake/modules/FindFlang.cmake +++ /dev/null @@ -1,17 +0,0 @@ -# FindFlang.cmake - -include(FindPackageHandleStandardArgs) - -# If Flang and lldb are in-tree then the libraries will already be available, otherwise look for specific directories -if(TARGET flangFrontEnd) - set(Flang_FOUND TRUE) -else() - find_package(Flang QUIET CONFIG HINTS ${Flang_DIR} ${LLVM_DIR}/../flang) -endif() - -find_package_handle_standard_args(Flang - FOUND_VAR - Flang_FOUND - REQUIRED_VARS - Flang_FOUND -) \ No newline at end of file diff --git a/lldb/cmake/modules/LLDBConfig.cmake b/lldb/cmake/modules/LLDBConfig.cmake index 82ad8b19ebb79..e086aaf5d3632 100644 --- a/lldb/cmake/modules/LLDBConfig.cmake +++ b/lldb/cmake/modules/LLDBConfig.cmake @@ -64,7 +64,6 @@ add_optional_dependency(LLDB_ENABLE_LUA "Enable Lua scripting support in LLDB" L add_optional_dependency(LLDB_ENABLE_PYTHON "Enable Python scripting support in LLDB" PythonAndSwig PYTHONANDSWIG_FOUND) add_optional_dependency(LLDB_ENABLE_LIBXML2 "Enable Libxml 2 support in LLDB" LibXml2 LIBXML2_FOUND VERSION ${LLDB_LIBXML2_VERSION}) add_optional_dependency(LLDB_ENABLE_TREESITTER "Enable Tree-sitter syntax highlighting" TreeSitter TREESITTER_FOUND) -add_optional_dependency(LLDB_ENABLE_FORTRAN "Enable Fortran support in lldb" Flang Flang_FOUND) option(LLDB_USE_ENTITLEMENTS "When codesigning, use entitlements if available" ON) option(LLDB_BUILD_FRAMEWORK "Build LLDB.framework (Darwin only)" OFF) >From 3c81c8db819d1d9b7e7dc5a0cb2145db02bfa48d Mon Sep 17 00:00:00 2001 From: Iasonaskrpr <[email protected]> Date: Fri, 17 Jul 2026 19:36:51 +0300 Subject: [PATCH 9/9] [lldb][Fortran] Removed TODO comments and updated file headers --- .../Plugins/Language/Fortran/FortranLanguage.cpp | 10 +++++++--- lldb/source/Plugins/Language/Fortran/FortranLanguage.h | 7 ++++++- .../Plugins/SymbolFile/DWARF/DWARFASTParserFortran.cpp | 7 ++++++- .../Plugins/SymbolFile/DWARF/DWARFASTParserFortran.h | 7 ++++++- .../Plugins/TypeSystem/Fortran/TypeSystemFortran.cpp | 10 ++++++---- .../Plugins/TypeSystem/Fortran/TypeSystemFortran.h | 9 +++++++-- .../unittests/Language/Fortran/FortranLanguageTest.cpp | 7 ++++++- 7 files changed, 44 insertions(+), 13 deletions(-) diff --git a/lldb/source/Plugins/Language/Fortran/FortranLanguage.cpp b/lldb/source/Plugins/Language/Fortran/FortranLanguage.cpp index a7040ae337b17..240b7cbab07a6 100644 --- a/lldb/source/Plugins/Language/Fortran/FortranLanguage.cpp +++ b/lldb/source/Plugins/Language/Fortran/FortranLanguage.cpp @@ -1,10 +1,15 @@ -//===-- FortranLanguage.cpp -----------------------------------------------===// +//===----------------------------------------------------------------------===// // // 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" @@ -43,7 +48,6 @@ StringRef FortranLanguage::GetPluginName() { return GetPluginNameStatic(); } uint32_t FortranLanguage::GetPluginVersion() { return 1; } Language *FortranLanguage::CreateInstance(LanguageType language) { - // FIXME: Should Fortran 77 be supported??? if (Language::LanguageIsFortran(language)) { return new FortranLanguage(); } @@ -51,7 +55,7 @@ Language *FortranLanguage::CreateInstance(LanguageType language) { } bool FortranLanguage::IsSourceFile(StringRef file_path) const { - const auto suffixes = {".f90", ".f"}; + const auto suffixes = {".f90", ".f", ".f95", ".f03", ".f08", ".f18"}; for (auto suffix : suffixes) { if (file_path.ends_with_insensitive(suffix)) return true; diff --git a/lldb/source/Plugins/Language/Fortran/FortranLanguage.h b/lldb/source/Plugins/Language/Fortran/FortranLanguage.h index 1116564e96c7a..2bd616f347b78 100644 --- a/lldb/source/Plugins/Language/Fortran/FortranLanguage.h +++ b/lldb/source/Plugins/Language/Fortran/FortranLanguage.h @@ -1,10 +1,15 @@ -//===-- FortranLanguage.h -------------------------------------------------===// +//===----------------------------------------------------------------------===// // // 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 diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserFortran.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserFortran.cpp index 2b9267f26612f..1179e0e004600 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserFortran.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserFortran.cpp @@ -1,10 +1,15 @@ -//===-- DWARFASTParserFortran.cpp -----------------------------------------===// +//===----------------------------------------------------------------------===// // // 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 DWARF AST Parser for the Fortran language. +/// +//===----------------------------------------------------------------------===// #include "DWARFASTParserFortran.h" diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserFortran.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserFortran.h index a688a8e810118..b0410be2ba89e 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserFortran.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserFortran.h @@ -1,10 +1,15 @@ -//===-- DWARFASTParserFortran.h -------------------------------------------===// +//===----------------------------------------------------------------------===// // // 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 DWARF AST Parser for the Fortran language. +/// +//===----------------------------------------------------------------------===// #ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFASTPARSERFORTRAN_H #define LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFASTPARSERFORTRAN_H diff --git a/lldb/source/Plugins/TypeSystem/Fortran/TypeSystemFortran.cpp b/lldb/source/Plugins/TypeSystem/Fortran/TypeSystemFortran.cpp index 7b6da8a77009d..2fe29a81c7520 100644 --- a/lldb/source/Plugins/TypeSystem/Fortran/TypeSystemFortran.cpp +++ b/lldb/source/Plugins/TypeSystem/Fortran/TypeSystemFortran.cpp @@ -1,10 +1,15 @@ -//===-- TypeSystemFortran.cpp -----------------------------------*- C++ -*-===// +//===----------------------------------------------------------------------===// // // 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 type system. +/// +//===----------------------------------------------------------------------===// #include "TypeSystemFortran.h" #include "lldb/Core/PluginManager.h" @@ -55,9 +60,6 @@ plugin::dwarf::DWARFASTParser *TypeSystemFortran::GetDWARFParser() { return m_dwarf_ast_parser_up.get(); } -// TODO: Process Target and architecture for pointers and Expression Evaluation, -// if module and target have different typesystems like clang, we would have to -// account for that here lldb::TypeSystemSP TypeSystemFortran::CreateInstance(lldb::LanguageType language, Module *module, Target *target) { diff --git a/lldb/source/Plugins/TypeSystem/Fortran/TypeSystemFortran.h b/lldb/source/Plugins/TypeSystem/Fortran/TypeSystemFortran.h index bf68cea4553c2..0c7e1f4c18c6c 100644 --- a/lldb/source/Plugins/TypeSystem/Fortran/TypeSystemFortran.h +++ b/lldb/source/Plugins/TypeSystem/Fortran/TypeSystemFortran.h @@ -1,10 +1,15 @@ -//===-- TypeSystemFortran.h -------------------------------------*- C++ -*-===// +//===----------------------------------------------------------------------===// // // 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 contains the definition of the Fortran Type System. +/// +//===----------------------------------------------------------------------===// #ifndef LLDB_SOURCE_PLUGINS_TYPESYSTEM_FORTRAN_TYPESYSTEMFORTRAN_H #define LLDB_SOURCE_PLUGINS_TYPESYSTEM_FORTRAN_TYPESYSTEMFORTRAN_H @@ -472,7 +477,7 @@ class TypeSystemFortran : public TypeSystem { CompilerType GetNonReferenceType(lldb::opaque_compiler_type_t type) override { return CompilerType(); } - // TODO + bool IsReferenceType(lldb::opaque_compiler_type_t type, CompilerType *pointee_type, bool *is_rvalue) override { return false; diff --git a/lldb/unittests/Language/Fortran/FortranLanguageTest.cpp b/lldb/unittests/Language/Fortran/FortranLanguageTest.cpp index 0b5e9b9e43818..5b81544539785 100644 --- a/lldb/unittests/Language/Fortran/FortranLanguageTest.cpp +++ b/lldb/unittests/Language/Fortran/FortranLanguageTest.cpp @@ -1,10 +1,15 @@ -//===-- FortranLanguagesTest.cpp ------------------------------------------===// +//===----------------------------------------------------------------------===// // // 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" _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
