2017-11-30 13:43:25 +01:00
|
|
|
//===-- llvm/MC/MCObjectFileInfo.h - Object File Info -----------*- C++ -*-===//
|
|
|
|
//
|
2019-01-19 09:50:56 +01:00
|
|
|
// 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
|
2017-11-30 13:43:25 +01:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// This file describes common object file formats.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#ifndef LLVM_MC_MCOBJECTFILEINFO_H
|
|
|
|
#define LLVM_MC_MCOBJECTFILEINFO_H
|
|
|
|
|
2018-06-22 12:53:47 +02:00
|
|
|
#include "llvm/ADT/DenseMap.h"
|
2017-11-30 13:43:25 +01:00
|
|
|
#include "llvm/ADT/Triple.h"
|
2018-06-22 12:53:47 +02:00
|
|
|
#include "llvm/MC/MCSymbol.h"
|
2017-11-30 13:43:25 +01:00
|
|
|
#include "llvm/Support/CodeGen.h"
|
2018-12-14 02:14:10 +01:00
|
|
|
#include "llvm/Support/VersionTuple.h"
|
2017-11-30 13:43:25 +01:00
|
|
|
|
|
|
|
namespace llvm {
|
|
|
|
class MCContext;
|
|
|
|
class MCSection;
|
|
|
|
|
|
|
|
class MCObjectFileInfo {
|
|
|
|
protected:
|
|
|
|
/// True if .comm supports alignment. This is a hack for as long as we
|
|
|
|
/// support 10.4 Tiger, whose assembler doesn't support alignment on comm.
|
2019-11-05 16:13:28 +01:00
|
|
|
bool CommDirectiveSupportsAlignment = false;
|
2017-11-30 13:43:25 +01:00
|
|
|
|
|
|
|
/// True if target object file supports a weak_definition of constant 0 for an
|
|
|
|
/// omitted EH frame.
|
2019-11-05 16:13:28 +01:00
|
|
|
bool SupportsWeakOmittedEHFrame = false;
|
2017-11-30 13:43:25 +01:00
|
|
|
|
|
|
|
/// True if the target object file supports emitting a compact unwind section
|
|
|
|
/// without an associated EH frame section.
|
2019-11-05 16:13:28 +01:00
|
|
|
bool SupportsCompactUnwindWithoutEHFrame = false;
|
2017-11-30 13:43:25 +01:00
|
|
|
|
|
|
|
/// OmitDwarfIfHaveCompactUnwind - True if the target object file
|
|
|
|
/// supports having some functions with compact unwind and other with
|
|
|
|
/// dwarf unwind.
|
2019-11-05 16:13:28 +01:00
|
|
|
bool OmitDwarfIfHaveCompactUnwind = false;
|
2017-11-30 13:43:25 +01:00
|
|
|
|
[MC] Move EH DWARF encodings from MC to CodeGen, NFC
Summary:
The TType encoding, LSDA encoding, and personality encoding are all
passed explicitly by CodeGen to the assembler through .cfi_* directives,
so only the AsmPrinter needs to know about them.
The FDE CFI encoding however, controls the encoding of the label
implicitly created by the .cfi_startproc directive. That directive seems
to be special in that it doesn't take an encoding, so the assembler just
has to know how to encode one DSO-local label reference from .eh_frame
to .text.
As a result, it looks like MC will continue to have to know when the
large code model is in use. Perhaps we could invent a '.cfi_startproc
[large]' flag so that this knowledge doesn't need to pollute the
assembler.
Reviewers: davide, lliu0, JDevlieghere
Subscribers: hiraditya, fedor.sergeev, llvm-commits
Differential Revision: https://reviews.llvm.org/D50533
llvm-svn: 339397
2018-08-10 00:24:04 +02:00
|
|
|
/// FDE CFI encoding. Controls the encoding of the begin label in the
|
|
|
|
/// .eh_frame section. Unlike the LSDA encoding, personality encoding, and
|
|
|
|
/// type encodings, this is something that the assembler just "knows" about
|
|
|
|
/// its target
|
|
|
|
unsigned FDECFIEncoding = 0;
|
2017-11-30 13:43:25 +01:00
|
|
|
|
|
|
|
/// Compact unwind encoding indicating that we should emit only an EH frame.
|
2019-11-05 16:13:28 +01:00
|
|
|
unsigned CompactUnwindDwarfEHFrameOnly = 0;
|
2017-11-30 13:43:25 +01:00
|
|
|
|
|
|
|
/// Section directive for standard text.
|
2019-11-05 16:13:28 +01:00
|
|
|
MCSection *TextSection = nullptr;
|
2017-11-30 13:43:25 +01:00
|
|
|
|
|
|
|
/// Section directive for standard data.
|
2019-11-05 16:13:28 +01:00
|
|
|
MCSection *DataSection = nullptr;
|
2017-11-30 13:43:25 +01:00
|
|
|
|
|
|
|
/// Section that is default initialized to zero.
|
2019-11-05 16:13:28 +01:00
|
|
|
MCSection *BSSSection = nullptr;
|
2017-11-30 13:43:25 +01:00
|
|
|
|
|
|
|
/// Section that is readonly and can contain arbitrary initialized data.
|
|
|
|
/// Targets are not required to have a readonly section. If they don't,
|
|
|
|
/// various bits of code will fall back to using the data section for
|
|
|
|
/// constants.
|
2019-11-05 16:13:28 +01:00
|
|
|
MCSection *ReadOnlySection = nullptr;
|
2017-11-30 13:43:25 +01:00
|
|
|
|
|
|
|
/// If exception handling is supported by the target, this is the section the
|
|
|
|
/// Language Specific Data Area information is emitted to.
|
2019-11-05 16:13:28 +01:00
|
|
|
MCSection *LSDASection = nullptr;
|
2017-11-30 13:43:25 +01:00
|
|
|
|
|
|
|
/// If exception handling is supported by the target and the target can
|
|
|
|
/// support a compact representation of the CIE and FDE, this is the section
|
|
|
|
/// to emit them into.
|
2019-11-05 16:13:28 +01:00
|
|
|
MCSection *CompactUnwindSection = nullptr;
|
2017-11-30 13:43:25 +01:00
|
|
|
|
|
|
|
// Dwarf sections for debug info. If a target supports debug info, these must
|
|
|
|
// be set.
|
2019-11-05 16:13:28 +01:00
|
|
|
MCSection *DwarfAbbrevSection = nullptr;
|
|
|
|
MCSection *DwarfInfoSection = nullptr;
|
|
|
|
MCSection *DwarfLineSection = nullptr;
|
|
|
|
MCSection *DwarfLineStrSection = nullptr;
|
|
|
|
MCSection *DwarfFrameSection = nullptr;
|
|
|
|
MCSection *DwarfPubTypesSection = nullptr;
|
|
|
|
const MCSection *DwarfDebugInlineSection = nullptr;
|
|
|
|
MCSection *DwarfStrSection = nullptr;
|
|
|
|
MCSection *DwarfLocSection = nullptr;
|
|
|
|
MCSection *DwarfARangesSection = nullptr;
|
|
|
|
MCSection *DwarfRangesSection = nullptr;
|
|
|
|
MCSection *DwarfMacinfoSection = nullptr;
|
2020-04-03 09:14:09 +02:00
|
|
|
MCSection *DwarfMacroSection = nullptr;
|
2017-11-30 13:43:25 +01:00
|
|
|
// The pubnames section is no longer generated by default. The generation
|
|
|
|
// can be enabled by a compiler flag.
|
2019-11-05 16:13:28 +01:00
|
|
|
MCSection *DwarfPubNamesSection = nullptr;
|
2017-11-30 13:43:25 +01:00
|
|
|
|
2018-04-04 16:42:14 +02:00
|
|
|
/// Accelerator table sections. DwarfDebugNamesSection is the DWARF v5
|
|
|
|
/// accelerator table, while DwarfAccelNamesSection, DwarfAccelObjCSection,
|
|
|
|
/// DwarfAccelNamespaceSection, DwarfAccelTypesSection are pre-DWARF v5
|
|
|
|
/// extensions.
|
2019-11-05 16:13:28 +01:00
|
|
|
MCSection *DwarfDebugNamesSection = nullptr;
|
|
|
|
MCSection *DwarfAccelNamesSection = nullptr;
|
|
|
|
MCSection *DwarfAccelObjCSection = nullptr;
|
|
|
|
MCSection *DwarfAccelNamespaceSection = nullptr;
|
|
|
|
MCSection *DwarfAccelTypesSection = nullptr;
|
2017-11-30 13:43:25 +01:00
|
|
|
|
|
|
|
// These are used for the Fission separate debug information files.
|
2019-11-05 16:13:28 +01:00
|
|
|
MCSection *DwarfInfoDWOSection = nullptr;
|
|
|
|
MCSection *DwarfTypesDWOSection = nullptr;
|
|
|
|
MCSection *DwarfAbbrevDWOSection = nullptr;
|
|
|
|
MCSection *DwarfStrDWOSection = nullptr;
|
|
|
|
MCSection *DwarfLineDWOSection = nullptr;
|
|
|
|
MCSection *DwarfLocDWOSection = nullptr;
|
|
|
|
MCSection *DwarfStrOffDWOSection = nullptr;
|
2019-11-11 08:23:19 +01:00
|
|
|
MCSection *DwarfMacinfoDWOSection = nullptr;
|
2020-05-30 07:41:09 +02:00
|
|
|
MCSection *DwarfMacroDWOSection = nullptr;
|
2017-11-30 13:43:25 +01:00
|
|
|
|
|
|
|
/// The DWARF v5 string offset and address table sections.
|
2019-11-05 16:13:28 +01:00
|
|
|
MCSection *DwarfStrOffSection = nullptr;
|
|
|
|
MCSection *DwarfAddrSection = nullptr;
|
2018-07-12 20:18:21 +02:00
|
|
|
/// The DWARF v5 range list section.
|
2019-11-05 16:13:28 +01:00
|
|
|
MCSection *DwarfRnglistsSection = nullptr;
|
2018-10-26 13:25:12 +02:00
|
|
|
/// The DWARF v5 locations list section.
|
2019-11-05 16:13:28 +01:00
|
|
|
MCSection *DwarfLoclistsSection = nullptr;
|
2018-07-12 20:18:21 +02:00
|
|
|
|
2019-11-23 15:34:36 +01:00
|
|
|
/// The DWARF v5 range and location list sections for fission.
|
2019-11-05 16:13:28 +01:00
|
|
|
MCSection *DwarfRnglistsDWOSection = nullptr;
|
2019-11-23 15:34:36 +01:00
|
|
|
MCSection *DwarfLoclistsDWOSection = nullptr;
|
2017-11-30 13:43:25 +01:00
|
|
|
|
|
|
|
// These are for Fission DWP files.
|
2019-11-05 16:13:28 +01:00
|
|
|
MCSection *DwarfCUIndexSection = nullptr;
|
|
|
|
MCSection *DwarfTUIndexSection = nullptr;
|
2017-11-30 13:43:25 +01:00
|
|
|
|
|
|
|
/// Section for newer gnu pubnames.
|
2019-11-05 16:13:28 +01:00
|
|
|
MCSection *DwarfGnuPubNamesSection = nullptr;
|
2017-11-30 13:43:25 +01:00
|
|
|
/// Section for newer gnu pubtypes.
|
2019-11-05 16:13:28 +01:00
|
|
|
MCSection *DwarfGnuPubTypesSection = nullptr;
|
2017-11-30 13:43:25 +01:00
|
|
|
|
|
|
|
// Section for Swift AST
|
2019-11-05 16:13:28 +01:00
|
|
|
MCSection *DwarfSwiftASTSection = nullptr;
|
2017-11-30 13:43:25 +01:00
|
|
|
|
2019-11-05 16:13:28 +01:00
|
|
|
MCSection *COFFDebugSymbolsSection = nullptr;
|
|
|
|
MCSection *COFFDebugTypesSection = nullptr;
|
|
|
|
MCSection *COFFGlobalTypeHashesSection = nullptr;
|
2017-11-30 13:43:25 +01:00
|
|
|
|
|
|
|
/// Extra TLS Variable Data section.
|
|
|
|
///
|
|
|
|
/// If the target needs to put additional information for a TLS variable,
|
|
|
|
/// it'll go here.
|
2019-11-05 16:13:28 +01:00
|
|
|
MCSection *TLSExtraDataSection = nullptr;
|
2017-11-30 13:43:25 +01:00
|
|
|
|
|
|
|
/// Section directive for Thread Local data. ELF, MachO, COFF, and Wasm.
|
2019-11-05 16:13:28 +01:00
|
|
|
MCSection *TLSDataSection = nullptr; // Defaults to ".tdata".
|
2017-11-30 13:43:25 +01:00
|
|
|
|
|
|
|
/// Section directive for Thread Local uninitialized data.
|
|
|
|
///
|
|
|
|
/// Null if this target doesn't support a BSS section. ELF and MachO only.
|
2019-11-05 16:13:28 +01:00
|
|
|
MCSection *TLSBSSSection = nullptr; // Defaults to ".tbss".
|
2017-11-30 13:43:25 +01:00
|
|
|
|
|
|
|
/// StackMap section.
|
2019-11-05 16:13:28 +01:00
|
|
|
MCSection *StackMapSection = nullptr;
|
2017-11-30 13:43:25 +01:00
|
|
|
|
|
|
|
/// FaultMap section.
|
2019-11-05 16:13:28 +01:00
|
|
|
MCSection *FaultMapSection = nullptr;
|
2017-11-30 13:43:25 +01:00
|
|
|
|
2019-03-27 02:13:59 +01:00
|
|
|
/// Remarks section.
|
2019-11-05 16:13:28 +01:00
|
|
|
MCSection *RemarksSection = nullptr;
|
2019-03-27 02:13:59 +01:00
|
|
|
|
2017-11-30 13:43:25 +01:00
|
|
|
/// EH frame section.
|
|
|
|
///
|
|
|
|
/// It is initialized on demand so it can be overwritten (with uniquing).
|
2019-11-05 16:13:28 +01:00
|
|
|
MCSection *EHFrameSection = nullptr;
|
2017-11-30 13:43:25 +01:00
|
|
|
|
2017-11-30 14:05:14 +01:00
|
|
|
/// Section containing metadata on function stack sizes.
|
2019-11-05 16:13:28 +01:00
|
|
|
MCSection *StackSizesSection = nullptr;
|
2017-11-30 14:05:14 +01:00
|
|
|
|
2017-11-30 13:43:25 +01:00
|
|
|
// ELF specific sections.
|
2019-11-05 16:13:28 +01:00
|
|
|
MCSection *DataRelROSection = nullptr;
|
|
|
|
MCSection *MergeableConst4Section = nullptr;
|
|
|
|
MCSection *MergeableConst8Section = nullptr;
|
|
|
|
MCSection *MergeableConst16Section = nullptr;
|
|
|
|
MCSection *MergeableConst32Section = nullptr;
|
2017-11-30 13:43:25 +01:00
|
|
|
|
|
|
|
// MachO specific sections.
|
|
|
|
|
|
|
|
/// Section for thread local structure information.
|
|
|
|
///
|
|
|
|
/// Contains the source code name of the variable, visibility and a pointer to
|
|
|
|
/// the initial value (.tdata or .tbss).
|
2019-11-05 16:13:28 +01:00
|
|
|
MCSection *TLSTLVSection = nullptr; // Defaults to ".tlv".
|
2017-11-30 13:43:25 +01:00
|
|
|
|
|
|
|
/// Section for thread local data initialization functions.
|
2019-11-05 16:13:28 +01:00
|
|
|
// Defaults to ".thread_init_func".
|
|
|
|
const MCSection *TLSThreadInitSection = nullptr;
|
|
|
|
|
|
|
|
MCSection *CStringSection = nullptr;
|
|
|
|
MCSection *UStringSection = nullptr;
|
|
|
|
MCSection *TextCoalSection = nullptr;
|
|
|
|
MCSection *ConstTextCoalSection = nullptr;
|
|
|
|
MCSection *ConstDataSection = nullptr;
|
|
|
|
MCSection *DataCoalSection = nullptr;
|
|
|
|
MCSection *ConstDataCoalSection = nullptr;
|
|
|
|
MCSection *DataCommonSection = nullptr;
|
|
|
|
MCSection *DataBSSSection = nullptr;
|
|
|
|
MCSection *FourByteConstantSection = nullptr;
|
|
|
|
MCSection *EightByteConstantSection = nullptr;
|
|
|
|
MCSection *SixteenByteConstantSection = nullptr;
|
|
|
|
MCSection *LazySymbolPointerSection = nullptr;
|
|
|
|
MCSection *NonLazySymbolPointerSection = nullptr;
|
|
|
|
MCSection *ThreadLocalPointerSection = nullptr;
|
2017-11-30 13:43:25 +01:00
|
|
|
|
|
|
|
/// COFF specific sections.
|
2019-11-05 16:13:28 +01:00
|
|
|
MCSection *DrectveSection = nullptr;
|
|
|
|
MCSection *PDataSection = nullptr;
|
|
|
|
MCSection *XDataSection = nullptr;
|
|
|
|
MCSection *SXDataSection = nullptr;
|
|
|
|
MCSection *GFIDsSection = nullptr;
|
|
|
|
MCSection *GLJMPSection = nullptr;
|
2017-11-30 13:43:25 +01:00
|
|
|
|
[NFC][XCOFF] Refactor Csect creation into TargetLoweringObjectFile
Summary:
We create a number of standard types of control sections in multiple places for
things like the function descriptors, external references and the TOC anchor
among others, so it is possible for their properties to be defined
inconsistently in different places. This refactor moves their creation and
properties into functions in the TargetLoweringObjectFile class hierarchy, where
functions for retrieving various special types of sections typically seem
to reside.
Note: There is one case in PPCISelLowering which is specific to function entry
points which we don't address since we don't have access to the TLOF there.
Reviewers: DiggerLin, jasonliu, hubert.reinterpretcast
Reviewed By: jasonliu, hubert.reinterpretcast
Subscribers: wuzish, nemanjai, hiraditya, kbarton, jsji, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D72347
2020-01-22 17:09:34 +01:00
|
|
|
// XCOFF specific sections
|
|
|
|
MCSection *TOCBaseSection = nullptr;
|
|
|
|
|
2017-11-30 13:43:25 +01:00
|
|
|
public:
|
|
|
|
void InitMCObjectFileInfo(const Triple &TT, bool PIC, MCContext &ctx,
|
|
|
|
bool LargeCodeModel = false);
|
2020-03-22 06:27:50 +01:00
|
|
|
MCContext &getContext() const { return *Ctx; }
|
2017-11-30 13:43:25 +01:00
|
|
|
|
|
|
|
bool getSupportsWeakOmittedEHFrame() const {
|
|
|
|
return SupportsWeakOmittedEHFrame;
|
|
|
|
}
|
|
|
|
bool getSupportsCompactUnwindWithoutEHFrame() const {
|
|
|
|
return SupportsCompactUnwindWithoutEHFrame;
|
|
|
|
}
|
|
|
|
bool getOmitDwarfIfHaveCompactUnwind() const {
|
|
|
|
return OmitDwarfIfHaveCompactUnwind;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool getCommDirectiveSupportsAlignment() const {
|
|
|
|
return CommDirectiveSupportsAlignment;
|
|
|
|
}
|
|
|
|
|
|
|
|
unsigned getFDEEncoding() const { return FDECFIEncoding; }
|
|
|
|
|
|
|
|
unsigned getCompactUnwindDwarfEHFrameOnly() const {
|
|
|
|
return CompactUnwindDwarfEHFrameOnly;
|
|
|
|
}
|
|
|
|
|
|
|
|
MCSection *getTextSection() const { return TextSection; }
|
|
|
|
MCSection *getDataSection() const { return DataSection; }
|
|
|
|
MCSection *getBSSSection() const { return BSSSection; }
|
|
|
|
MCSection *getReadOnlySection() const { return ReadOnlySection; }
|
|
|
|
MCSection *getLSDASection() const { return LSDASection; }
|
|
|
|
MCSection *getCompactUnwindSection() const { return CompactUnwindSection; }
|
|
|
|
MCSection *getDwarfAbbrevSection() const { return DwarfAbbrevSection; }
|
|
|
|
MCSection *getDwarfInfoSection() const { return DwarfInfoSection; }
|
2018-11-09 20:06:09 +01:00
|
|
|
MCSection *getDwarfInfoSection(uint64_t Hash) const {
|
|
|
|
return getDwarfComdatSection(".debug_info", Hash);
|
|
|
|
}
|
2017-11-30 13:43:25 +01:00
|
|
|
MCSection *getDwarfLineSection() const { return DwarfLineSection; }
|
2018-02-06 21:29:21 +01:00
|
|
|
MCSection *getDwarfLineStrSection() const { return DwarfLineStrSection; }
|
2017-11-30 13:43:25 +01:00
|
|
|
MCSection *getDwarfFrameSection() const { return DwarfFrameSection; }
|
|
|
|
MCSection *getDwarfPubNamesSection() const { return DwarfPubNamesSection; }
|
|
|
|
MCSection *getDwarfPubTypesSection() const { return DwarfPubTypesSection; }
|
|
|
|
MCSection *getDwarfGnuPubNamesSection() const {
|
|
|
|
return DwarfGnuPubNamesSection;
|
|
|
|
}
|
|
|
|
MCSection *getDwarfGnuPubTypesSection() const {
|
|
|
|
return DwarfGnuPubTypesSection;
|
|
|
|
}
|
|
|
|
const MCSection *getDwarfDebugInlineSection() const {
|
|
|
|
return DwarfDebugInlineSection;
|
|
|
|
}
|
|
|
|
MCSection *getDwarfStrSection() const { return DwarfStrSection; }
|
|
|
|
MCSection *getDwarfLocSection() const { return DwarfLocSection; }
|
|
|
|
MCSection *getDwarfARangesSection() const { return DwarfARangesSection; }
|
|
|
|
MCSection *getDwarfRangesSection() const { return DwarfRangesSection; }
|
2018-07-12 20:18:21 +02:00
|
|
|
MCSection *getDwarfRnglistsSection() const { return DwarfRnglistsSection; }
|
2018-10-26 13:25:12 +02:00
|
|
|
MCSection *getDwarfLoclistsSection() const { return DwarfLoclistsSection; }
|
2017-11-30 13:43:25 +01:00
|
|
|
MCSection *getDwarfMacinfoSection() const { return DwarfMacinfoSection; }
|
2020-04-03 09:14:09 +02:00
|
|
|
MCSection *getDwarfMacroSection() const { return DwarfMacroSection; }
|
2017-11-30 13:43:25 +01:00
|
|
|
|
2018-04-04 16:42:14 +02:00
|
|
|
MCSection *getDwarfDebugNamesSection() const {
|
|
|
|
return DwarfDebugNamesSection;
|
|
|
|
}
|
2017-11-30 13:43:25 +01:00
|
|
|
MCSection *getDwarfAccelNamesSection() const {
|
|
|
|
return DwarfAccelNamesSection;
|
|
|
|
}
|
|
|
|
MCSection *getDwarfAccelObjCSection() const { return DwarfAccelObjCSection; }
|
|
|
|
MCSection *getDwarfAccelNamespaceSection() const {
|
|
|
|
return DwarfAccelNamespaceSection;
|
|
|
|
}
|
|
|
|
MCSection *getDwarfAccelTypesSection() const {
|
|
|
|
return DwarfAccelTypesSection;
|
|
|
|
}
|
|
|
|
MCSection *getDwarfInfoDWOSection() const { return DwarfInfoDWOSection; }
|
2018-11-09 20:06:09 +01:00
|
|
|
MCSection *getDwarfTypesSection(uint64_t Hash) const {
|
|
|
|
return getDwarfComdatSection(".debug_types", Hash);
|
|
|
|
}
|
2017-11-30 13:43:25 +01:00
|
|
|
MCSection *getDwarfTypesDWOSection() const { return DwarfTypesDWOSection; }
|
|
|
|
MCSection *getDwarfAbbrevDWOSection() const { return DwarfAbbrevDWOSection; }
|
|
|
|
MCSection *getDwarfStrDWOSection() const { return DwarfStrDWOSection; }
|
|
|
|
MCSection *getDwarfLineDWOSection() const { return DwarfLineDWOSection; }
|
|
|
|
MCSection *getDwarfLocDWOSection() const { return DwarfLocDWOSection; }
|
|
|
|
MCSection *getDwarfStrOffDWOSection() const { return DwarfStrOffDWOSection; }
|
|
|
|
MCSection *getDwarfStrOffSection() const { return DwarfStrOffSection; }
|
|
|
|
MCSection *getDwarfAddrSection() const { return DwarfAddrSection; }
|
2018-07-12 20:18:21 +02:00
|
|
|
MCSection *getDwarfRnglistsDWOSection() const {
|
|
|
|
return DwarfRnglistsDWOSection;
|
|
|
|
}
|
2019-11-23 15:34:36 +01:00
|
|
|
MCSection *getDwarfLoclistsDWOSection() const {
|
|
|
|
return DwarfLoclistsDWOSection;
|
|
|
|
}
|
2020-05-30 07:41:09 +02:00
|
|
|
MCSection *getDwarfMacroDWOSection() const { return DwarfMacroDWOSection; }
|
2019-11-11 08:23:19 +01:00
|
|
|
MCSection *getDwarfMacinfoDWOSection() const {
|
|
|
|
return DwarfMacinfoDWOSection;
|
|
|
|
}
|
2017-11-30 13:43:25 +01:00
|
|
|
MCSection *getDwarfCUIndexSection() const { return DwarfCUIndexSection; }
|
|
|
|
MCSection *getDwarfTUIndexSection() const { return DwarfTUIndexSection; }
|
|
|
|
MCSection *getDwarfSwiftASTSection() const { return DwarfSwiftASTSection; }
|
|
|
|
|
|
|
|
MCSection *getCOFFDebugSymbolsSection() const {
|
|
|
|
return COFFDebugSymbolsSection;
|
|
|
|
}
|
|
|
|
MCSection *getCOFFDebugTypesSection() const {
|
|
|
|
return COFFDebugTypesSection;
|
|
|
|
}
|
2017-12-13 23:33:58 +01:00
|
|
|
MCSection *getCOFFGlobalTypeHashesSection() const {
|
|
|
|
return COFFGlobalTypeHashesSection;
|
|
|
|
}
|
2017-11-30 13:43:25 +01:00
|
|
|
|
|
|
|
MCSection *getTLSExtraDataSection() const { return TLSExtraDataSection; }
|
|
|
|
const MCSection *getTLSDataSection() const { return TLSDataSection; }
|
|
|
|
MCSection *getTLSBSSSection() const { return TLSBSSSection; }
|
|
|
|
|
|
|
|
MCSection *getStackMapSection() const { return StackMapSection; }
|
|
|
|
MCSection *getFaultMapSection() const { return FaultMapSection; }
|
2019-03-27 02:13:59 +01:00
|
|
|
MCSection *getRemarksSection() const { return RemarksSection; }
|
2017-11-30 13:43:25 +01:00
|
|
|
|
2018-06-22 12:53:47 +02:00
|
|
|
MCSection *getStackSizesSection(const MCSection &TextSec) const;
|
2017-11-30 14:05:14 +01:00
|
|
|
|
2017-11-30 13:43:25 +01:00
|
|
|
// ELF specific sections.
|
|
|
|
MCSection *getDataRelROSection() const { return DataRelROSection; }
|
|
|
|
const MCSection *getMergeableConst4Section() const {
|
|
|
|
return MergeableConst4Section;
|
|
|
|
}
|
|
|
|
const MCSection *getMergeableConst8Section() const {
|
|
|
|
return MergeableConst8Section;
|
|
|
|
}
|
|
|
|
const MCSection *getMergeableConst16Section() const {
|
|
|
|
return MergeableConst16Section;
|
|
|
|
}
|
|
|
|
const MCSection *getMergeableConst32Section() const {
|
|
|
|
return MergeableConst32Section;
|
|
|
|
}
|
|
|
|
|
|
|
|
// MachO specific sections.
|
|
|
|
const MCSection *getTLSTLVSection() const { return TLSTLVSection; }
|
|
|
|
const MCSection *getTLSThreadInitSection() const {
|
|
|
|
return TLSThreadInitSection;
|
|
|
|
}
|
|
|
|
const MCSection *getCStringSection() const { return CStringSection; }
|
|
|
|
const MCSection *getUStringSection() const { return UStringSection; }
|
|
|
|
MCSection *getTextCoalSection() const { return TextCoalSection; }
|
|
|
|
const MCSection *getConstTextCoalSection() const {
|
|
|
|
return ConstTextCoalSection;
|
|
|
|
}
|
|
|
|
const MCSection *getConstDataSection() const { return ConstDataSection; }
|
|
|
|
const MCSection *getDataCoalSection() const { return DataCoalSection; }
|
2018-04-10 22:16:35 +02:00
|
|
|
const MCSection *getConstDataCoalSection() const {
|
|
|
|
return ConstDataCoalSection;
|
|
|
|
}
|
2017-11-30 13:43:25 +01:00
|
|
|
const MCSection *getDataCommonSection() const { return DataCommonSection; }
|
|
|
|
MCSection *getDataBSSSection() const { return DataBSSSection; }
|
|
|
|
const MCSection *getFourByteConstantSection() const {
|
|
|
|
return FourByteConstantSection;
|
|
|
|
}
|
|
|
|
const MCSection *getEightByteConstantSection() const {
|
|
|
|
return EightByteConstantSection;
|
|
|
|
}
|
|
|
|
const MCSection *getSixteenByteConstantSection() const {
|
|
|
|
return SixteenByteConstantSection;
|
|
|
|
}
|
|
|
|
MCSection *getLazySymbolPointerSection() const {
|
|
|
|
return LazySymbolPointerSection;
|
|
|
|
}
|
|
|
|
MCSection *getNonLazySymbolPointerSection() const {
|
|
|
|
return NonLazySymbolPointerSection;
|
|
|
|
}
|
|
|
|
MCSection *getThreadLocalPointerSection() const {
|
|
|
|
return ThreadLocalPointerSection;
|
|
|
|
}
|
|
|
|
|
|
|
|
// COFF specific sections.
|
|
|
|
MCSection *getDrectveSection() const { return DrectveSection; }
|
|
|
|
MCSection *getPDataSection() const { return PDataSection; }
|
|
|
|
MCSection *getXDataSection() const { return XDataSection; }
|
|
|
|
MCSection *getSXDataSection() const { return SXDataSection; }
|
2018-01-10 00:49:30 +01:00
|
|
|
MCSection *getGFIDsSection() const { return GFIDsSection; }
|
Add Windows Control Flow Guard checks (/guard:cf).
Summary:
A new function pass (Transforms/CFGuard/CFGuard.cpp) inserts CFGuard checks on
indirect function calls, using either the check mechanism (X86, ARM, AArch64) or
or the dispatch mechanism (X86-64). The check mechanism requires a new calling
convention for the supported targets. The dispatch mechanism adds the target as
an operand bundle, which is processed by SelectionDAG. Another pass
(CodeGen/CFGuardLongjmp.cpp) identifies and emits valid longjmp targets, as
required by /guard:cf. This feature is enabled using the `cfguard` CC1 option.
Reviewers: thakis, rnk, theraven, pcc
Subscribers: ychen, hans, metalcanine, dmajor, tomrittervg, alex, mehdi_amini, mgorny, javed.absar, kristof.beyls, hiraditya, steven_wu, dexonsmith, cfe-commits, llvm-commits
Tags: #clang, #llvm
Differential Revision: https://reviews.llvm.org/D65761
2019-10-28 14:22:19 +01:00
|
|
|
MCSection *getGLJMPSection() const { return GLJMPSection; }
|
2017-11-30 13:43:25 +01:00
|
|
|
|
[NFC][XCOFF] Refactor Csect creation into TargetLoweringObjectFile
Summary:
We create a number of standard types of control sections in multiple places for
things like the function descriptors, external references and the TOC anchor
among others, so it is possible for their properties to be defined
inconsistently in different places. This refactor moves their creation and
properties into functions in the TargetLoweringObjectFile class hierarchy, where
functions for retrieving various special types of sections typically seem
to reside.
Note: There is one case in PPCISelLowering which is specific to function entry
points which we don't address since we don't have access to the TLOF there.
Reviewers: DiggerLin, jasonliu, hubert.reinterpretcast
Reviewed By: jasonliu, hubert.reinterpretcast
Subscribers: wuzish, nemanjai, hiraditya, kbarton, jsji, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D72347
2020-01-22 17:09:34 +01:00
|
|
|
// XCOFF specific sections
|
|
|
|
MCSection *getTOCBaseSection() const { return TOCBaseSection; }
|
|
|
|
|
2017-11-30 13:43:25 +01:00
|
|
|
MCSection *getEHFrameSection() {
|
|
|
|
return EHFrameSection;
|
|
|
|
}
|
|
|
|
|
2019-03-12 23:01:10 +01:00
|
|
|
enum Environment { IsMachO, IsELF, IsCOFF, IsWasm, IsXCOFF };
|
2017-11-30 13:43:25 +01:00
|
|
|
Environment getObjectFileType() const { return Env; }
|
|
|
|
|
|
|
|
bool isPositionIndependent() const { return PositionIndependent; }
|
|
|
|
|
|
|
|
private:
|
|
|
|
Environment Env;
|
2019-11-05 16:13:28 +01:00
|
|
|
bool PositionIndependent = false;
|
|
|
|
MCContext *Ctx = nullptr;
|
2017-11-30 13:43:25 +01:00
|
|
|
Triple TT;
|
2018-12-14 02:14:10 +01:00
|
|
|
VersionTuple SDKVersion;
|
2017-11-30 13:43:25 +01:00
|
|
|
|
|
|
|
void initMachOMCObjectFileInfo(const Triple &T);
|
|
|
|
void initELFMCObjectFileInfo(const Triple &T, bool Large);
|
|
|
|
void initCOFFMCObjectFileInfo(const Triple &T);
|
|
|
|
void initWasmMCObjectFileInfo(const Triple &T);
|
2019-07-09 21:21:01 +02:00
|
|
|
void initXCOFFMCObjectFileInfo(const Triple &T);
|
2018-11-09 20:06:09 +01:00
|
|
|
MCSection *getDwarfComdatSection(const char *Name, uint64_t Hash) const;
|
2017-11-30 13:43:25 +01:00
|
|
|
|
|
|
|
public:
|
|
|
|
const Triple &getTargetTriple() const { return TT; }
|
2018-12-14 02:14:10 +01:00
|
|
|
|
|
|
|
void setSDKVersion(const VersionTuple &TheSDKVersion) {
|
|
|
|
SDKVersion = TheSDKVersion;
|
|
|
|
}
|
|
|
|
|
|
|
|
const VersionTuple &getSDKVersion() const { return SDKVersion; }
|
2017-11-30 13:43:25 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
} // end namespace llvm
|
|
|
|
|
|
|
|
#endif
|