LLDB mainline
TypeSystemFortran.h
Go to the documentation of this file.
1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLDB_SOURCE_PLUGINS_TYPESYSTEM_FORTRAN_TYPESYSTEMFORTRAN_H
10#define LLDB_SOURCE_PLUGINS_TYPESYSTEM_FORTRAN_TYPESYSTEMFORTRAN_H
11
12#include "FortranTypes.h"
13
15
16#include "llvm/ADT/FoldingSet.h"
17#include "llvm/Support/ErrorHandling.h"
18
19namespace lldb_private {
20
22 // LLVM RTTI support
23 static char ID;
24
25public:
26 // llvm casting support
27 bool isA(const void *ClassID) const override { return ClassID == &ID; }
28 static bool classof(const TypeSystem *ts) { return ts->isA(&ID); }
29
31
33
34 static void Initialize();
35
36 static void Terminate();
37
39
41 Module *module, Target *target);
42
44
46
47 // CompilerDecl functions
48 ConstString DeclGetName(void *opaque_decl) override { return ConstString(); }
49
50 CompilerType GetTypeForDecl(void *opaque_decl) override {
51 return CompilerType();
52 }
53
54 // CompilerDeclContext functions
55
56 ConstString DeclContextGetName(void *opaque_decl_ctx) override {
57 return ConstString();
58 }
59
60 ConstString DeclContextGetScopeQualifiedName(void *opaque_decl_ctx) override {
61 return ConstString();
62 }
63
64 bool DeclContextIsClassMethod(void *opaque_decl_ctx) override {
65 return false;
66 }
67
68 bool DeclContextIsContainedInLookup(void *opaque_decl_ctx,
69 void *other_opaque_decl_ctx) override {
70 return false;
71 }
72
76
77// Tests
78#ifndef NDEBUG
79 /// Verify the integrity of the type to catch CompilerTypes that mix
80 /// and match invalid TypeSystem/Opaque type pairs.
81 bool Verify(lldb::opaque_compiler_type_t type) override;
82#endif
83
85 CompilerType *element_type, uint64_t *size,
86 bool *is_incomplete) override {
87 return false;
88 };
89
91 return false;
92 }
93
94 bool IsCharType(lldb::opaque_compiler_type_t type) override { return false; }
95
97 return true;
98 }
99
100 bool IsDefined(lldb::opaque_compiler_type_t type) override { return true; }
101
103
105 return false;
106 }
107
108 size_t
110 return 0;
111 }
112
114 const size_t index) override {
115 return CompilerType();
116 }
117
119 return false;
120 }
121
123 return false;
124 }
125
127 return false;
128 }
129
131 CompilerType *function_pointer_type_ptr) override {
132 return false;
133 }
134
136 bool &is_signed) override;
137
139 return false;
140 }
141
143 CompilerType *target_type, // Can pass NULL
144 bool check_cplusplus, bool check_objc) override {
145 return false;
146 }
147
149 CompilerType *pointee_type) override {
150 return false;
151 }
152
153 bool IsScalarType(lldb::opaque_compiler_type_t type) override { return true; }
154
155 bool IsVoidType(lldb::opaque_compiler_type_t type) override { return false; }
156
157 bool CanPassInRegisters(const CompilerType &type) override { return false; }
158
159 // TypeSystems can support more than one language
160 bool SupportsLanguage(lldb::LanguageType language) override;
161
162 llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
163
164 static llvm::StringRef GetPluginNameStatic() { return "fortran"; }
165
166 // Type Completion
167
169 return true;
170 }
171
172 // AST related queries
173
174 uint32_t GetPointerByteSize() override { return 0; }
175
176 CompilerType GetPointerDiffType(bool is_signed) override {
177 return CompilerType();
178 }
179
180 CompilerType GetSizeType() override { return CompilerType(); }
181
183 return 0;
184 }
185
187 return 0;
188 }
189
191 return false;
192 }
193
194 // Accessors
195
197 bool BaseOnly) override;
198
200 return GetTypeName(type, false);
201 }
202
203 uint32_t
205 CompilerType *pointee_or_element_compiler_type) override {
206 return 0;
207 }
208
213
214 lldb::TypeClass GetTypeClass(lldb::opaque_compiler_type_t type) override;
215
216 CompilerType GetOrCreateFortranBaseType(int kind, uint64_t bitsize,
217 ConstString name);
218
219 CompilerType CreateBaseType(llvm::dwarf::TypeKind dwarf_encoding,
220 uint64_t bitsize, ConstString name);
221
222 // Creating related types
223
228
230
235
236 // Returns -1 if this isn't a function of if the function doesn't have a
237 // prototype Returns a value >= 0 if there is a prototype.
239 return -1;
240 }
241
243 size_t idx) override {
244 return CompilerType();
245 }
246
251
253 return 0;
254 }
255
258 size_t idx) override {
259 return TypeMemberFunctionImpl();
260 }
261
265
269
270 // Exploring the type
271
272 const llvm::fltSemantics &
273 GetFloatTypeSemantics(size_t byte_size, lldb::Format format) override {
274 return llvm::APFloatBase::Bogus();
275 }
276
277 llvm::Expected<uint64_t>
279 ExecutionContextScope *exe_scope) override;
280
284
288
289 llvm::Expected<uint32_t>
291 bool omit_empty_base_classes,
292 const ExecutionContext *exe_ctx) override {
293 return 0;
294 }
295
298
300 return 0;
301 }
302
304 std::string &name, uint64_t *bit_offset_ptr,
305 uint32_t *bitfield_bit_size_ptr,
306 bool *is_bitfield_ptr) override {
307 return CompilerType();
308 }
309
311 return 0;
312 }
313
314 uint32_t
316 return 0;
317 }
318
320 size_t idx,
321 uint32_t *bit_offset_ptr) override {
322 return CompilerType();
323 }
324
326 size_t idx,
327 uint32_t *bit_offset_ptr) override {
328 return CompilerType();
329 }
330
331 llvm::Expected<CompilerType>
333 ExecutionContext *exe_ctx, std::string &deref_name,
334 uint32_t &deref_byte_size, int32_t &deref_byte_offset,
335 ValueObject *valobj, uint64_t &language_flags) override {
336 return CompilerType();
337 }
338
339 llvm::Expected<CompilerType> GetChildCompilerTypeAtIndex(
340 lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx, size_t idx,
341 bool transparent_pointers, bool omit_empty_base_classes,
342 bool ignore_array_bounds, std::string &child_name,
343 uint32_t &child_byte_size, int32_t &child_byte_offset,
344 uint32_t &child_bitfield_bit_size, uint32_t &child_bitfield_bit_offset,
345 bool &child_is_base_class, bool &child_is_deref_of_parent,
346 ValueObject *valobj, uint64_t &language_flags) override {
347 return CompilerType();
348 }
349
350 llvm::Expected<uint32_t>
352 llvm::StringRef name,
353 bool omit_empty_base_classes) override {
354 return 0;
355 }
356
357 size_t
359 llvm::StringRef name,
360 bool omit_empty_base_classes,
361 std::vector<uint32_t> &child_indexes) override {
362 return 0;
363 }
364
365#ifndef NDEBUG
366 /// Convenience LLVM-style dump method for use in the debugger only.
367 LLVM_DUMP_METHOD void dump(lldb::opaque_compiler_type_t type) const override {
368 }
369#endif
370
372 lldb::Format format, const DataExtractor &data,
373 lldb::offset_t data_offset, size_t data_byte_size,
374 uint32_t bitfield_bit_size, uint32_t bitfield_bit_offset,
375 ExecutionContextScope *exe_scope) override {
376 return false;
377 }
378
379 /// Dump the type to stdout.
383
384 /// Print a description of the type to a stream. The exact implementation
385 /// varies, but the expectation is that eDescriptionLevelFull returns a
386 /// source-like representation of the type, whereas eDescriptionLevelVerbose
387 /// does a dump of the underlying AST if applicable.
391
392 /// Dump a textual representation of the internal TypeSystem state to the
393 /// given stream.
394 ///
395 /// This should not modify the state of the TypeSystem if possible.
396 ///
397 /// \param[out] output Stream to dup the AST into.
398 /// \param[in] filter If empty, dump whole AST. If non-empty, will only
399 /// dump decls whose names contain \c filter.
400 /// \param[in] show_color If true, prints the AST color-highlighted.
401 void Dump(llvm::raw_ostream &output, llvm::StringRef filter,
402 bool show_color) override {}
403
404 /// This is used by Swift.
406 return false;
407 }
408
409 // Pointer here means C-style pointers, not Fortran-style.
411 CompilerType *pointee_type) override {
412 return false;
413 }
414
416 return 0;
417 }
418
419 std::optional<size_t>
421 ExecutionContextScope *exe_scope) override {
422 return 0;
423 }
424
426
428 size_t bit_size) override;
429
431 return false;
432 }
433
434 bool IsConst(lldb::opaque_compiler_type_t type) override { return false; }
435
437 CompilerType *base_type_ptr) override {
438 return 0;
439 }
440
442 return false;
443 }
444
446 return false;
447 }
448
449 // If the current object represents a typedef type, get the underlying type
453
455 CompilerType *element_type, uint64_t *size) override {
456 return false;
457 }
458
463
467
469 CompilerType *pointee_type, bool *is_rvalue) override {
470 return false;
471 }
472
473private:
474 mutable llvm::FoldingSet<plugin::fortran::FortranType> m_basic_types;
475 // We store all unique pointer types here so we can manage the lifecycle
476 // of the types
477 mutable llvm::SmallVector<std::unique_ptr<plugin::fortran::FortranType>>
479 std::unique_ptr<plugin::dwarf::DWARFASTParser> m_dwarf_ast_parser_up;
480
483};
484
485} // namespace lldb_private
486
487#endif // LLDB_SOURCE_PLUGINS_TYPESYSTEM_FORTRAN_TYPESYSTEMFORTRAN_H
This file defines the classes that describe the Fortran types.
Generic representation of a type in a programming language.
A uniqued constant string class.
Definition ConstString.h:40
An data extractor class.
"lldb/Target/ExecutionContextScope.h" Inherit from this if your object can reconstruct its execution ...
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
A class that describes an executable image and its associated object and symbol files.
Definition Module.h:91
A stream class that can stream formatted output to a file.
Definition Stream.h:28
CompilerType GetVirtualBaseClassAtIndex(lldb::opaque_compiler_type_t type, size_t idx, uint32_t *bit_offset_ptr) override
bool IsPossibleDynamicType(lldb::opaque_compiler_type_t type, CompilerType *target_type, bool check_cplusplus, bool check_objc) override
ConstString DeclContextGetName(void *opaque_decl_ctx) override
bool IsCharType(lldb::opaque_compiler_type_t type) override
size_t GetNumberOfFunctionArguments(lldb::opaque_compiler_type_t type) override
TypeSystemFortran(const TypeSystemFortran &)=delete
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
bool IsAggregateType(lldb::opaque_compiler_type_t type) override
void DumpTypeDescription(lldb::opaque_compiler_type_t type, lldb::DescriptionLevel level=lldb::eDescriptionLevelFull) override
Dump the type to stdout.
static lldb::TypeSystemSP CreateInstance(lldb::LanguageType language, Module *module, Target *target)
bool IsIntegerType(lldb::opaque_compiler_type_t type, bool &is_signed) override
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
plugin::dwarf::DWARFASTParser * GetDWARFParser() override
bool IsScopedEnumerationType(lldb::opaque_compiler_type_t type) override
bool IsMemberDataPointerType(lldb::opaque_compiler_type_t type) override
bool IsFloatingPointType(lldb::opaque_compiler_type_t type) override
bool isA(const void *ClassID) const override
llvm::SmallVector< std::unique_ptr< plugin::fortran::FortranType > > m_types
uint32_t GetTypeInfo(lldb::opaque_compiler_type_t type, CompilerType *pointee_or_element_compiler_type) override
lldb::Encoding GetEncoding(lldb::opaque_compiler_type_t type) override
CompilerType GetDirectBaseClassAtIndex(lldb::opaque_compiler_type_t type, size_t idx, uint32_t *bit_offset_ptr) override
uint32_t IsHomogeneousAggregate(lldb::opaque_compiler_type_t type, CompilerType *base_type_ptr) override
bool IsDefined(lldb::opaque_compiler_type_t type) override
lldb::Format GetFormat(lldb::opaque_compiler_type_t type) override
ConstString GetDisplayTypeName(lldb::opaque_compiler_type_t type) override
CompilerType GetArrayElementType(lldb::opaque_compiler_type_t type, ExecutionContextScope *exe_scope) override
static LanguageSet GetSupportedLanguagesForExpressions()
CompilerType GetFunctionArgumentTypeAtIndex(lldb::opaque_compiler_type_t type, size_t idx) override
lldb::LanguageType DeclContextGetLanguage(void *opaque_decl_ctx) override
TypeMemberFunctionImpl GetMemberFunctionAtIndex(lldb::opaque_compiler_type_t type, size_t idx) override
int GetFunctionArgumentCount(lldb::opaque_compiler_type_t type) override
void DumpTypeDescription(lldb::opaque_compiler_type_t type, Stream &s, lldb::DescriptionLevel level=lldb::eDescriptionLevelFull) override
Print a description of the type to a stream.
CompilerType GetTypeForDecl(void *opaque_decl) override
ConstString GetTypeName(lldb::opaque_compiler_type_t type, bool BaseOnly) override
Returns the type name upper-cased to follow Fortran's general style.
CompilerType GetPointerDiffType(bool is_signed) override
bool IsBeingDefined(lldb::opaque_compiler_type_t type) override
llvm::StringRef GetPluginName() override
llvm::Expected< uint32_t > GetNumChildren(lldb::opaque_compiler_type_t type, bool omit_empty_base_classes, const ExecutionContext *exe_ctx) override
CompilerType GetSizeType() override
std::optional< size_t > GetTypeBitAlign(lldb::opaque_compiler_type_t type, ExecutionContextScope *exe_scope) override
unsigned GetPtrAuthKey(lldb::opaque_compiler_type_t type) override
CompilerType GetFunctionArgumentAtIndex(lldb::opaque_compiler_type_t type, const size_t index) override
size_t GetIndexOfChildMemberWithName(lldb::opaque_compiler_type_t type, llvm::StringRef name, bool omit_empty_base_classes, std::vector< uint32_t > &child_indexes) override
bool IsScalarType(lldb::opaque_compiler_type_t type) override
unsigned GetPtrAuthDiscriminator(lldb::opaque_compiler_type_t type) override
bool CanPassInRegisters(const CompilerType &type) override
CompilerType GetFunctionReturnType(lldb::opaque_compiler_type_t type) override
CompilerType GetBasicTypeFromAST(lldb::BasicType basic_type) override
bool IsCompleteType(lldb::opaque_compiler_type_t type) override
bool IsRuntimeGeneratedType(lldb::opaque_compiler_type_t type) override
This is used by Swift.
bool IsPointerOrReferenceType(lldb::opaque_compiler_type_t type, CompilerType *pointee_type) override
bool IsVoidType(lldb::opaque_compiler_type_t type) override
bool DeclContextIsClassMethod(void *opaque_decl_ctx) override
bool IsFunctionPointerType(lldb::opaque_compiler_type_t type) override
llvm::Expected< uint32_t > GetIndexOfChildWithName(lldb::opaque_compiler_type_t type, llvm::StringRef name, bool omit_empty_base_classes) override
bool IsReferenceType(lldb::opaque_compiler_type_t type, CompilerType *pointee_type, bool *is_rvalue) override
bool IsBlockPointerType(lldb::opaque_compiler_type_t type, CompilerType *function_pointer_type_ptr) override
bool IsTypedefType(lldb::opaque_compiler_type_t type) override
llvm::FoldingSet< plugin::fortran::FortranType > m_basic_types
uint32_t GetNumDirectBaseClasses(lldb::opaque_compiler_type_t type) override
bool GetPtrAuthAddressDiversity(lldb::opaque_compiler_type_t type) override
CompilerType GetFullyUnqualifiedType(lldb::opaque_compiler_type_t type) override
CompilerType GetTypedefedType(lldb::opaque_compiler_type_t type) override
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
CompilerType GetCanonicalType(lldb::opaque_compiler_type_t type) override
uint32_t GetNumVirtualBaseClasses(lldb::opaque_compiler_type_t type) override
bool IsMemberFunctionPointerType(lldb::opaque_compiler_type_t type) override
static LanguageSet GetSupportedLanguagesForTypes()
lldb::TypeClass GetTypeClass(lldb::opaque_compiler_type_t type) override
CompilerType GetEnumerationIntegerType(lldb::opaque_compiler_type_t type) override
bool GetCompleteType(lldb::opaque_compiler_type_t type) override
bool IsConst(lldb::opaque_compiler_type_t type) override
CompilerType GetOrCreateFortranBaseType(int kind, uint64_t bitsize, ConstString name)
Creates the type if it has not been created before, otherwise it gets it from the type map.
size_t GetNumMemberFunctions(lldb::opaque_compiler_type_t type) override
const llvm::fltSemantics & GetFloatTypeSemantics(size_t byte_size, lldb::Format format) override
static bool classof(const TypeSystem *ts)
CompilerType CreateBaseType(llvm::dwarf::TypeKind dwarf_encoding, uint64_t bitsize, ConstString name)
LLVM_DUMP_METHOD void dump(lldb::opaque_compiler_type_t type) const override
Convenience LLVM-style dump method for use in the debugger only.
CompilerType GetPointerType(lldb::opaque_compiler_type_t type) override
bool IsVectorType(lldb::opaque_compiler_type_t type, CompilerType *element_type, uint64_t *size) override
CompilerType GetBuiltinTypeForEncodingAndBitSize(lldb::Encoding encoding, size_t bit_size) override
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
bool IsPointerType(lldb::opaque_compiler_type_t type, CompilerType *pointee_type) override
unsigned GetTypeQualifiers(lldb::opaque_compiler_type_t type) override
bool SupportsLanguage(lldb::LanguageType language) override
bool IsPolymorphicClass(lldb::opaque_compiler_type_t type) override
CompilerType GetNonReferenceType(lldb::opaque_compiler_type_t type) override
lldb::LanguageType GetMinimumLanguage(lldb::opaque_compiler_type_t type) override
uint32_t GetNumFields(lldb::opaque_compiler_type_t type) override
bool DeclContextIsContainedInLookup(void *opaque_decl_ctx, void *other_opaque_decl_ctx) override
const TypeSystemFortran & operator=(const TypeSystemFortran &)=delete
static llvm::StringRef GetPluginNameStatic()
std::unique_ptr< plugin::dwarf::DWARFASTParser > m_dwarf_ast_parser_up
bool IsFunctionType(lldb::opaque_compiler_type_t type) override
lldb::BasicType GetBasicTypeEnumeration(lldb::opaque_compiler_type_t type) override
bool Verify(lldb::opaque_compiler_type_t type) override
Verify the integrity of the type to catch CompilerTypes that mix and match invalid TypeSystem/Opaque ...
ConstString DeclGetName(void *opaque_decl) override
llvm::Expected< uint64_t > GetBitSize(lldb::opaque_compiler_type_t type, ExecutionContextScope *exe_scope) override
ConstString DeclContextGetScopeQualifiedName(void *opaque_decl_ctx) override
CompilerType GetPointeeType(lldb::opaque_compiler_type_t type) override
void Dump(llvm::raw_ostream &output, llvm::StringRef filter, bool show_color) override
Dump a textual representation of the internal TypeSystem state to the given stream.
bool IsArrayType(lldb::opaque_compiler_type_t type, CompilerType *element_type, uint64_t *size, bool *is_incomplete) override
virtual bool isA(const void *ClassID) const =0
A class that represents a running process on the host machine.
std::shared_ptr< lldb_private::TypeSystem > TypeSystemSP
void * opaque_compiler_type_t
Definition lldb-types.h:91
DescriptionLevel
Description levels for "void GetDescription(Stream *, DescriptionLevel)" calls.
@ eDescriptionLevelFull
BasicType
Basic types enumeration for the public API SBType::GetBasicType().
Format
Display format definitions.
uint64_t offset_t
Definition lldb-types.h:86
LanguageType
Programming language type.
@ eLanguageTypeUnknown
Unknown or invalid language value.
@ eLanguageTypeFortran90
ISO Fortran 90.
Encoding
Register encoding definitions.
A SmallBitVector that represents a set of source languages (lldb::LanguageType).