Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //===-- llvm/MC/MCObjectFileInfo.h - Object File Info -----------*- 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-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // This file describes common object file formats.
  10. //
  11. //===----------------------------------------------------------------------===//
  12.  
  13. #ifndef LLVM_MC_MCOBJECTFILEINFO_H
  14. #define LLVM_MC_MCOBJECTFILEINFO_H
  15.  
  16. #include "llvm/ADT/Triple.h"
  17. #include "llvm/BinaryFormat/Swift.h"
  18. #include "llvm/MC/MCSection.h"
  19. #include "llvm/Support/VersionTuple.h"
  20.  
  21. #include <array>
  22. #include <optional>
  23.  
  24. namespace llvm {
  25. class MCContext;
  26. class MCSection;
  27.  
  28. class MCObjectFileInfo {
  29. protected:
  30.   /// True if target object file supports a weak_definition of constant 0 for an
  31.   /// omitted EH frame.
  32.   bool SupportsWeakOmittedEHFrame = false;
  33.  
  34.   /// True if the target object file supports emitting a compact unwind section
  35.   /// without an associated EH frame section.
  36.   bool SupportsCompactUnwindWithoutEHFrame = false;
  37.  
  38.   /// OmitDwarfIfHaveCompactUnwind - True if the target object file
  39.   /// supports having some functions with compact unwind and other with
  40.   /// dwarf unwind.
  41.   bool OmitDwarfIfHaveCompactUnwind = false;
  42.  
  43.   /// FDE CFI encoding. Controls the encoding of the begin label in the
  44.   /// .eh_frame section. Unlike the LSDA encoding, personality encoding, and
  45.   /// type encodings, this is something that the assembler just "knows" about
  46.   /// its target
  47.   unsigned FDECFIEncoding = 0;
  48.  
  49.   /// Compact unwind encoding indicating that we should emit only an EH frame.
  50.   unsigned CompactUnwindDwarfEHFrameOnly = 0;
  51.  
  52.   /// Section directive for standard text.
  53.   MCSection *TextSection = nullptr;
  54.  
  55.   /// Section directive for standard data.
  56.   MCSection *DataSection = nullptr;
  57.  
  58.   /// Section that is default initialized to zero.
  59.   MCSection *BSSSection = nullptr;
  60.  
  61.   /// Section that is readonly and can contain arbitrary initialized data.
  62.   /// Targets are not required to have a readonly section. If they don't,
  63.   /// various bits of code will fall back to using the data section for
  64.   /// constants.
  65.   MCSection *ReadOnlySection = nullptr;
  66.  
  67.   /// If exception handling is supported by the target, this is the section the
  68.   /// Language Specific Data Area information is emitted to.
  69.   MCSection *LSDASection = nullptr;
  70.  
  71.   /// If exception handling is supported by the target and the target can
  72.   /// support a compact representation of the CIE and FDE, this is the section
  73.   /// to emit them into.
  74.   MCSection *CompactUnwindSection = nullptr;
  75.  
  76.   // Dwarf sections for debug info.  If a target supports debug info, these must
  77.   // be set.
  78.   MCSection *DwarfAbbrevSection = nullptr;
  79.   MCSection *DwarfInfoSection = nullptr;
  80.   MCSection *DwarfLineSection = nullptr;
  81.   MCSection *DwarfLineStrSection = nullptr;
  82.   MCSection *DwarfFrameSection = nullptr;
  83.   MCSection *DwarfPubTypesSection = nullptr;
  84.   const MCSection *DwarfDebugInlineSection = nullptr;
  85.   MCSection *DwarfStrSection = nullptr;
  86.   MCSection *DwarfLocSection = nullptr;
  87.   MCSection *DwarfARangesSection = nullptr;
  88.   MCSection *DwarfRangesSection = nullptr;
  89.   MCSection *DwarfMacinfoSection = nullptr;
  90.   MCSection *DwarfMacroSection = nullptr;
  91.   // The pubnames section is no longer generated by default.  The generation
  92.   // can be enabled by a compiler flag.
  93.   MCSection *DwarfPubNamesSection = nullptr;
  94.  
  95.   /// Accelerator table sections. DwarfDebugNamesSection is the DWARF v5
  96.   /// accelerator table, while DwarfAccelNamesSection, DwarfAccelObjCSection,
  97.   /// DwarfAccelNamespaceSection, DwarfAccelTypesSection are pre-DWARF v5
  98.   /// extensions.
  99.   MCSection *DwarfDebugNamesSection = nullptr;
  100.   MCSection *DwarfAccelNamesSection = nullptr;
  101.   MCSection *DwarfAccelObjCSection = nullptr;
  102.   MCSection *DwarfAccelNamespaceSection = nullptr;
  103.   MCSection *DwarfAccelTypesSection = nullptr;
  104.  
  105.   // These are used for the Fission separate debug information files.
  106.   MCSection *DwarfInfoDWOSection = nullptr;
  107.   MCSection *DwarfTypesDWOSection = nullptr;
  108.   MCSection *DwarfAbbrevDWOSection = nullptr;
  109.   MCSection *DwarfStrDWOSection = nullptr;
  110.   MCSection *DwarfLineDWOSection = nullptr;
  111.   MCSection *DwarfLocDWOSection = nullptr;
  112.   MCSection *DwarfStrOffDWOSection = nullptr;
  113.   MCSection *DwarfMacinfoDWOSection = nullptr;
  114.   MCSection *DwarfMacroDWOSection = nullptr;
  115.  
  116.   /// The DWARF v5 string offset and address table sections.
  117.   MCSection *DwarfStrOffSection = nullptr;
  118.   MCSection *DwarfAddrSection = nullptr;
  119.   /// The DWARF v5 range list section.
  120.   MCSection *DwarfRnglistsSection = nullptr;
  121.   /// The DWARF v5 locations list section.
  122.   MCSection *DwarfLoclistsSection = nullptr;
  123.  
  124.   /// The DWARF v5 range and location list sections for fission.
  125.   MCSection *DwarfRnglistsDWOSection = nullptr;
  126.   MCSection *DwarfLoclistsDWOSection = nullptr;
  127.  
  128.   // These are for Fission DWP files.
  129.   MCSection *DwarfCUIndexSection = nullptr;
  130.   MCSection *DwarfTUIndexSection = nullptr;
  131.  
  132.   /// Section for newer gnu pubnames.
  133.   MCSection *DwarfGnuPubNamesSection = nullptr;
  134.   /// Section for newer gnu pubtypes.
  135.   MCSection *DwarfGnuPubTypesSection = nullptr;
  136.  
  137.   // Section for Swift AST
  138.   MCSection *DwarfSwiftASTSection = nullptr;
  139.  
  140.   MCSection *COFFDebugSymbolsSection = nullptr;
  141.   MCSection *COFFDebugTypesSection = nullptr;
  142.   MCSection *COFFGlobalTypeHashesSection = nullptr;
  143.  
  144.   /// Extra TLS Variable Data section.
  145.   ///
  146.   /// If the target needs to put additional information for a TLS variable,
  147.   /// it'll go here.
  148.   MCSection *TLSExtraDataSection = nullptr;
  149.  
  150.   /// Section directive for Thread Local data. ELF, MachO, COFF, and Wasm.
  151.   MCSection *TLSDataSection = nullptr; // Defaults to ".tdata".
  152.  
  153.   /// Section directive for Thread Local uninitialized data.
  154.   ///
  155.   /// Null if this target doesn't support a BSS section. ELF and MachO only.
  156.   MCSection *TLSBSSSection = nullptr; // Defaults to ".tbss".
  157.  
  158.   /// StackMap section.
  159.   MCSection *StackMapSection = nullptr;
  160.  
  161.   /// FaultMap section.
  162.   MCSection *FaultMapSection = nullptr;
  163.  
  164.   /// Remarks section.
  165.   MCSection *RemarksSection = nullptr;
  166.  
  167.   /// EH frame section.
  168.   ///
  169.   /// It is initialized on demand so it can be overwritten (with uniquing).
  170.   MCSection *EHFrameSection = nullptr;
  171.  
  172.   /// Section containing metadata on function stack sizes.
  173.   MCSection *StackSizesSection = nullptr;
  174.  
  175.   /// Section for pseudo probe information used by AutoFDO
  176.   MCSection *PseudoProbeSection = nullptr;
  177.   MCSection *PseudoProbeDescSection = nullptr;
  178.  
  179.   // Section for metadata of llvm statistics.
  180.   MCSection *LLVMStatsSection = nullptr;
  181.  
  182.   // ELF specific sections.
  183.   MCSection *DataRelROSection = nullptr;
  184.   MCSection *MergeableConst4Section = nullptr;
  185.   MCSection *MergeableConst8Section = nullptr;
  186.   MCSection *MergeableConst16Section = nullptr;
  187.   MCSection *MergeableConst32Section = nullptr;
  188.  
  189.   // MachO specific sections.
  190.  
  191.   /// Section for thread local structure information.
  192.   ///
  193.   /// Contains the source code name of the variable, visibility and a pointer to
  194.   /// the initial value (.tdata or .tbss).
  195.   MCSection *TLSTLVSection = nullptr; // Defaults to ".tlv".
  196.  
  197.   /// Section for thread local data initialization functions.
  198.    // Defaults to ".thread_init_func".
  199.   const MCSection *TLSThreadInitSection = nullptr;
  200.  
  201.   MCSection *CStringSection = nullptr;
  202.   MCSection *UStringSection = nullptr;
  203.   MCSection *TextCoalSection = nullptr;
  204.   MCSection *ConstTextCoalSection = nullptr;
  205.   MCSection *ConstDataSection = nullptr;
  206.   MCSection *DataCoalSection = nullptr;
  207.   MCSection *ConstDataCoalSection = nullptr;
  208.   MCSection *DataCommonSection = nullptr;
  209.   MCSection *DataBSSSection = nullptr;
  210.   MCSection *FourByteConstantSection = nullptr;
  211.   MCSection *EightByteConstantSection = nullptr;
  212.   MCSection *SixteenByteConstantSection = nullptr;
  213.   MCSection *LazySymbolPointerSection = nullptr;
  214.   MCSection *NonLazySymbolPointerSection = nullptr;
  215.   MCSection *ThreadLocalPointerSection = nullptr;
  216.   MCSection *AddrSigSection = nullptr;
  217.  
  218.   /// COFF specific sections.
  219.   MCSection *DrectveSection = nullptr;
  220.   MCSection *PDataSection = nullptr;
  221.   MCSection *XDataSection = nullptr;
  222.   MCSection *SXDataSection = nullptr;
  223.   MCSection *GEHContSection = nullptr;
  224.   MCSection *GFIDsSection = nullptr;
  225.   MCSection *GIATsSection = nullptr;
  226.   MCSection *GLJMPSection = nullptr;
  227.  
  228.   // GOFF specific sections.
  229.   MCSection *PPA1Section = nullptr;
  230.  
  231.   // XCOFF specific sections
  232.   MCSection *TOCBaseSection = nullptr;
  233.   MCSection *ReadOnly8Section = nullptr;
  234.   MCSection *ReadOnly16Section = nullptr;
  235.  
  236.   // Swift5 Reflection Data Sections
  237.   std::array<MCSection *, binaryformat::Swift5ReflectionSectionKind::last>
  238.       Swift5ReflectionSections = {};
  239.  
  240. public:
  241.   void initMCObjectFileInfo(MCContext &MCCtx, bool PIC,
  242.                             bool LargeCodeModel = false);
  243.   virtual ~MCObjectFileInfo();
  244.   MCContext &getContext() const { return *Ctx; }
  245.  
  246.   bool getSupportsWeakOmittedEHFrame() const {
  247.     return SupportsWeakOmittedEHFrame;
  248.   }
  249.   bool getSupportsCompactUnwindWithoutEHFrame() const {
  250.     return SupportsCompactUnwindWithoutEHFrame;
  251.   }
  252.   bool getOmitDwarfIfHaveCompactUnwind() const {
  253.     return OmitDwarfIfHaveCompactUnwind;
  254.   }
  255.  
  256.   unsigned getFDEEncoding() const { return FDECFIEncoding; }
  257.  
  258.   unsigned getCompactUnwindDwarfEHFrameOnly() const {
  259.     return CompactUnwindDwarfEHFrameOnly;
  260.   }
  261.  
  262.   virtual unsigned getTextSectionAlignment() const { return 4; }
  263.   MCSection *getTextSection() const { return TextSection; }
  264.   MCSection *getDataSection() const { return DataSection; }
  265.   MCSection *getBSSSection() const { return BSSSection; }
  266.   MCSection *getReadOnlySection() const { return ReadOnlySection; }
  267.   MCSection *getLSDASection() const { return LSDASection; }
  268.   MCSection *getCompactUnwindSection() const { return CompactUnwindSection; }
  269.   MCSection *getDwarfAbbrevSection() const { return DwarfAbbrevSection; }
  270.   MCSection *getDwarfInfoSection() const { return DwarfInfoSection; }
  271.   MCSection *getDwarfInfoSection(uint64_t Hash) const {
  272.     return getDwarfComdatSection(".debug_info", Hash);
  273.   }
  274.   MCSection *getDwarfLineSection() const { return DwarfLineSection; }
  275.   MCSection *getDwarfLineStrSection() const { return DwarfLineStrSection; }
  276.   MCSection *getDwarfFrameSection() const { return DwarfFrameSection; }
  277.   MCSection *getDwarfPubNamesSection() const { return DwarfPubNamesSection; }
  278.   MCSection *getDwarfPubTypesSection() const { return DwarfPubTypesSection; }
  279.   MCSection *getDwarfGnuPubNamesSection() const {
  280.     return DwarfGnuPubNamesSection;
  281.   }
  282.   MCSection *getDwarfGnuPubTypesSection() const {
  283.     return DwarfGnuPubTypesSection;
  284.   }
  285.   const MCSection *getDwarfDebugInlineSection() const {
  286.     return DwarfDebugInlineSection;
  287.   }
  288.   MCSection *getDwarfStrSection() const { return DwarfStrSection; }
  289.   MCSection *getDwarfLocSection() const { return DwarfLocSection; }
  290.   MCSection *getDwarfARangesSection() const { return DwarfARangesSection; }
  291.   MCSection *getDwarfRangesSection() const { return DwarfRangesSection; }
  292.   MCSection *getDwarfRnglistsSection() const { return DwarfRnglistsSection; }
  293.   MCSection *getDwarfLoclistsSection() const { return DwarfLoclistsSection; }
  294.   MCSection *getDwarfMacinfoSection() const { return DwarfMacinfoSection; }
  295.   MCSection *getDwarfMacroSection() const { return DwarfMacroSection; }
  296.  
  297.   MCSection *getDwarfDebugNamesSection() const {
  298.     return DwarfDebugNamesSection;
  299.   }
  300.   MCSection *getDwarfAccelNamesSection() const {
  301.     return DwarfAccelNamesSection;
  302.   }
  303.   MCSection *getDwarfAccelObjCSection() const { return DwarfAccelObjCSection; }
  304.   MCSection *getDwarfAccelNamespaceSection() const {
  305.     return DwarfAccelNamespaceSection;
  306.   }
  307.   MCSection *getDwarfAccelTypesSection() const {
  308.     return DwarfAccelTypesSection;
  309.   }
  310.   MCSection *getDwarfInfoDWOSection() const { return DwarfInfoDWOSection; }
  311.   MCSection *getDwarfTypesSection(uint64_t Hash) const {
  312.     return getDwarfComdatSection(".debug_types", Hash);
  313.   }
  314.   MCSection *getDwarfTypesDWOSection() const { return DwarfTypesDWOSection; }
  315.   MCSection *getDwarfAbbrevDWOSection() const { return DwarfAbbrevDWOSection; }
  316.   MCSection *getDwarfStrDWOSection() const { return DwarfStrDWOSection; }
  317.   MCSection *getDwarfLineDWOSection() const { return DwarfLineDWOSection; }
  318.   MCSection *getDwarfLocDWOSection() const { return DwarfLocDWOSection; }
  319.   MCSection *getDwarfStrOffDWOSection() const { return DwarfStrOffDWOSection; }
  320.   MCSection *getDwarfStrOffSection() const { return DwarfStrOffSection; }
  321.   MCSection *getDwarfAddrSection() const { return DwarfAddrSection; }
  322.   MCSection *getDwarfRnglistsDWOSection() const {
  323.     return DwarfRnglistsDWOSection;
  324.   }
  325.   MCSection *getDwarfLoclistsDWOSection() const {
  326.     return DwarfLoclistsDWOSection;
  327.   }
  328.   MCSection *getDwarfMacroDWOSection() const { return DwarfMacroDWOSection; }
  329.   MCSection *getDwarfMacinfoDWOSection() const {
  330.     return DwarfMacinfoDWOSection;
  331.   }
  332.   MCSection *getDwarfCUIndexSection() const { return DwarfCUIndexSection; }
  333.   MCSection *getDwarfTUIndexSection() const { return DwarfTUIndexSection; }
  334.   MCSection *getDwarfSwiftASTSection() const { return DwarfSwiftASTSection; }
  335.  
  336.   MCSection *getCOFFDebugSymbolsSection() const {
  337.     return COFFDebugSymbolsSection;
  338.   }
  339.   MCSection *getCOFFDebugTypesSection() const {
  340.     return COFFDebugTypesSection;
  341.   }
  342.   MCSection *getCOFFGlobalTypeHashesSection() const {
  343.     return COFFGlobalTypeHashesSection;
  344.   }
  345.  
  346.   MCSection *getTLSExtraDataSection() const { return TLSExtraDataSection; }
  347.   const MCSection *getTLSDataSection() const { return TLSDataSection; }
  348.   MCSection *getTLSBSSSection() const { return TLSBSSSection; }
  349.  
  350.   MCSection *getStackMapSection() const { return StackMapSection; }
  351.   MCSection *getFaultMapSection() const { return FaultMapSection; }
  352.   MCSection *getRemarksSection() const { return RemarksSection; }
  353.  
  354.   MCSection *getStackSizesSection(const MCSection &TextSec) const;
  355.  
  356.   MCSection *getBBAddrMapSection(const MCSection &TextSec) const;
  357.  
  358.   MCSection *getKCFITrapSection(const MCSection &TextSec) const;
  359.  
  360.   MCSection *getPseudoProbeSection(const MCSection &TextSec) const;
  361.  
  362.   MCSection *getPseudoProbeDescSection(StringRef FuncName) const;
  363.  
  364.   MCSection *getLLVMStatsSection() const;
  365.  
  366.   MCSection *getPCSection(StringRef Name, const MCSection *TextSec) const;
  367.  
  368.   // ELF specific sections.
  369.   MCSection *getDataRelROSection() const { return DataRelROSection; }
  370.   const MCSection *getMergeableConst4Section() const {
  371.     return MergeableConst4Section;
  372.   }
  373.   const MCSection *getMergeableConst8Section() const {
  374.     return MergeableConst8Section;
  375.   }
  376.   const MCSection *getMergeableConst16Section() const {
  377.     return MergeableConst16Section;
  378.   }
  379.   const MCSection *getMergeableConst32Section() const {
  380.     return MergeableConst32Section;
  381.   }
  382.  
  383.   // MachO specific sections.
  384.   const MCSection *getTLSTLVSection() const { return TLSTLVSection; }
  385.   const MCSection *getTLSThreadInitSection() const {
  386.     return TLSThreadInitSection;
  387.   }
  388.   const MCSection *getCStringSection() const { return CStringSection; }
  389.   const MCSection *getUStringSection() const { return UStringSection; }
  390.   MCSection *getTextCoalSection() const { return TextCoalSection; }
  391.   const MCSection *getConstTextCoalSection() const {
  392.     return ConstTextCoalSection;
  393.   }
  394.   const MCSection *getConstDataSection() const { return ConstDataSection; }
  395.   const MCSection *getDataCoalSection() const { return DataCoalSection; }
  396.   const MCSection *getConstDataCoalSection() const {
  397.     return ConstDataCoalSection;
  398.   }
  399.   const MCSection *getDataCommonSection() const { return DataCommonSection; }
  400.   MCSection *getDataBSSSection() const { return DataBSSSection; }
  401.   const MCSection *getFourByteConstantSection() const {
  402.     return FourByteConstantSection;
  403.   }
  404.   const MCSection *getEightByteConstantSection() const {
  405.     return EightByteConstantSection;
  406.   }
  407.   const MCSection *getSixteenByteConstantSection() const {
  408.     return SixteenByteConstantSection;
  409.   }
  410.   MCSection *getLazySymbolPointerSection() const {
  411.     return LazySymbolPointerSection;
  412.   }
  413.   MCSection *getNonLazySymbolPointerSection() const {
  414.     return NonLazySymbolPointerSection;
  415.   }
  416.   MCSection *getThreadLocalPointerSection() const {
  417.     return ThreadLocalPointerSection;
  418.   }
  419.   MCSection *getAddrSigSection() const { return AddrSigSection; }
  420.  
  421.   // COFF specific sections.
  422.   MCSection *getDrectveSection() const { return DrectveSection; }
  423.   MCSection *getPDataSection() const { return PDataSection; }
  424.   MCSection *getXDataSection() const { return XDataSection; }
  425.   MCSection *getSXDataSection() const { return SXDataSection; }
  426.   MCSection *getGEHContSection() const { return GEHContSection; }
  427.   MCSection *getGFIDsSection() const { return GFIDsSection; }
  428.   MCSection *getGIATsSection() const { return GIATsSection; }
  429.   MCSection *getGLJMPSection() const { return GLJMPSection; }
  430.  
  431.   // GOFF specific sections.
  432.   MCSection *getPPA1Section() const { return PPA1Section; }
  433.  
  434.   // XCOFF specific sections
  435.   MCSection *getTOCBaseSection() const { return TOCBaseSection; }
  436.  
  437.   MCSection *getEHFrameSection() const { return EHFrameSection; }
  438.  
  439.   bool isPositionIndependent() const { return PositionIndependent; }
  440.  
  441.   // Swift5 Reflection Data Sections
  442.   MCSection *getSwift5ReflectionSection(
  443.       llvm::binaryformat::Swift5ReflectionSectionKind ReflSectionKind) {
  444.     return ReflSectionKind !=
  445.                    llvm::binaryformat::Swift5ReflectionSectionKind::unknown
  446.                ? Swift5ReflectionSections[ReflSectionKind]
  447.                : nullptr;
  448.   }
  449.  
  450. private:
  451.   bool PositionIndependent = false;
  452.   MCContext *Ctx = nullptr;
  453.   VersionTuple SDKVersion;
  454.   std::optional<Triple> DarwinTargetVariantTriple;
  455.   VersionTuple DarwinTargetVariantSDKVersion;
  456.  
  457.   void initMachOMCObjectFileInfo(const Triple &T);
  458.   void initELFMCObjectFileInfo(const Triple &T, bool Large);
  459.   void initGOFFMCObjectFileInfo(const Triple &T);
  460.   void initCOFFMCObjectFileInfo(const Triple &T);
  461.   void initSPIRVMCObjectFileInfo(const Triple &T);
  462.   void initWasmMCObjectFileInfo(const Triple &T);
  463.   void initXCOFFMCObjectFileInfo(const Triple &T);
  464.   void initDXContainerObjectFileInfo(const Triple &T);
  465.   MCSection *getDwarfComdatSection(const char *Name, uint64_t Hash) const;
  466.  
  467. public:
  468.   void setSDKVersion(const VersionTuple &TheSDKVersion) {
  469.     SDKVersion = TheSDKVersion;
  470.   }
  471.  
  472.   const VersionTuple &getSDKVersion() const { return SDKVersion; }
  473.  
  474.   void setDarwinTargetVariantTriple(const Triple &T) {
  475.     DarwinTargetVariantTriple = T;
  476.   }
  477.  
  478.   const Triple *getDarwinTargetVariantTriple() const {
  479.     return DarwinTargetVariantTriple ? &*DarwinTargetVariantTriple : nullptr;
  480.   }
  481.  
  482.   void setDarwinTargetVariantSDKVersion(const VersionTuple &TheSDKVersion) {
  483.     DarwinTargetVariantSDKVersion = TheSDKVersion;
  484.   }
  485.  
  486.   const VersionTuple &getDarwinTargetVariantSDKVersion() const {
  487.     return DarwinTargetVariantSDKVersion;
  488.   }
  489. };
  490.  
  491. } // end namespace llvm
  492.  
  493. #endif
  494.