brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.8 KiB · 9e57240 Raw
112 lines · c
1//===-- lib/Semantics/mod-file.h --------------------------------*- C++ -*-===//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-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef FORTRAN_SEMANTICS_MOD_FILE_H_10#define FORTRAN_SEMANTICS_MOD_FILE_H_11 12#include "flang/Semantics/attr.h"13#include "flang/Semantics/symbol.h"14#include "llvm/Support/raw_ostream.h"15#include <string>16 17namespace Fortran::parser {18class CharBlock;19class Message;20class MessageFixedText;21} // namespace Fortran::parser22 23namespace llvm {24class raw_ostream;25}26 27namespace Fortran::semantics {28 29using SourceName = parser::CharBlock;30class Symbol;31class Scope;32class SemanticsContext;33 34class ModFileWriter {35public:36  explicit ModFileWriter(SemanticsContext &context) : context_{context} {}37  bool WriteAll();38  void WriteClosure(llvm::raw_ostream &, const Symbol &,39      UnorderedSymbolSet &nonIntrinsicModulesWritten);40  ModFileWriter &set_hermeticModuleFileOutput(bool yes = true) {41    hermeticModuleFileOutput_ = yes;42    return *this;43  }44 45private:46  SemanticsContext &context_;47  // Buffers to use with raw_string_ostream48  std::string needsBuf_;49  std::string usesBuf_;50  std::string useExtraAttrsBuf_;51  std::string declsBuf_;52  std::string containsBuf_;53  // Tracks nested DEC structures and fields of that type54  UnorderedSymbolSet emittedDECStructures_, emittedDECFields_;55  UnorderedSymbolSet usedNonIntrinsicModules_;56 57  llvm::raw_string_ostream needs_{needsBuf_};58  llvm::raw_string_ostream uses_{usesBuf_};59  llvm::raw_string_ostream useExtraAttrs_{60      useExtraAttrsBuf_}; // attrs added to used entity61  llvm::raw_string_ostream decls_{declsBuf_};62  llvm::raw_string_ostream contains_{containsBuf_};63  bool isSubmodule_{false};64  bool hermeticModuleFileOutput_{false};65 66  void WriteAll(const Scope &);67  void WriteOne(const Scope &);68  void Write(const Symbol &);69  std::string GetAsString(const Symbol &);70  void PrepareRenamings(const Scope &);71  void PutSymbols(const Scope &, UnorderedSymbolSet *hermetic);72  // Returns true if a derived type with bindings and "contains" was emitted73  bool PutComponents(const Symbol &);74  void PutSymbol(llvm::raw_ostream &, const Symbol &);75  void PutEntity(llvm::raw_ostream &, const Symbol &);76  void PutEntity(77      llvm::raw_ostream &, const Symbol &, std::function<void()>, Attrs);78  void PutObjectEntity(llvm::raw_ostream &, const Symbol &);79  void PutProcEntity(llvm::raw_ostream &, const Symbol &);80  void PutDerivedType(const Symbol &, const Scope * = nullptr);81  void PutDECStructure(const Symbol &, const Scope * = nullptr);82  void PutTypeParam(llvm::raw_ostream &, const Symbol &);83  void PutUserReduction(llvm::raw_ostream &, const Symbol &);84  void PutSubprogram(const Symbol &);85  void PutGeneric(const Symbol &);86  void PutUse(const Symbol &);87  void PutUseExtraAttr(Attr, const Symbol &, const Symbol &);88  llvm::raw_ostream &PutAttrs(llvm::raw_ostream &, Attrs,89      const std::string * = nullptr, bool = false, std::string before = ","s,90      std::string after = ""s) const;91  void PutDirective(llvm::raw_ostream &, const Symbol &);92};93 94class ModFileReader {95public:96  ModFileReader(SemanticsContext &context) : context_{context} {}97  // Find and read the module file for a module or submodule.98  // If ancestor is specified, look for a submodule of that module.99  // Return the Scope for that module/submodule or nullptr on error.100  Scope *Read(SourceName, std::optional<bool> isIntrinsic, Scope *ancestor,101      bool silent);102 103private:104  SemanticsContext &context_;105 106  parser::Message &Say(const char *verb, SourceName, const std::string &,107      parser::MessageFixedText &&, const std::string &);108};109 110} // namespace Fortran::semantics111#endif112