aboutsummaryrefslogtreecommitdiff
path: root/backend/include
diff options
context:
space:
mode:
Diffstat (limited to 'backend/include')
-rw-r--r--backend/include/rcc/CodeGen/GlobalObject.h9
-rw-r--r--backend/include/rcc/CodeGen/InstructionDescriptor.h1
-rw-r--r--backend/include/rcc/CodeGen/MIRParser/MIParser.h2
-rw-r--r--backend/include/rcc/CodeGen/MachineOperand.h5
-rw-r--r--backend/include/rcc/CodeGen/MachinePseudoExpansion.h14
-rw-r--r--backend/include/rcc/CodeGen/TargetPseudoExpansion.h1
-rw-r--r--backend/include/rcc/MIR/EmbeddedIR.h5
-rw-r--r--backend/include/rcc/Target/RISCV/RISCVFixupKinds.h1
-rw-r--r--backend/include/rcc/Target/RISCV/RISCVInstPrinter.h1
-rw-r--r--backend/include/rcc/Target/RISCV/RISCVSubtarget.h15
-rw-r--r--backend/include/rcc/Tooling/BackendInvocation.h2
11 files changed, 53 insertions, 3 deletions
diff --git a/backend/include/rcc/CodeGen/GlobalObject.h b/backend/include/rcc/CodeGen/GlobalObject.h
index 1ddc34a..b67421f 100644
--- a/backend/include/rcc/CodeGen/GlobalObject.h
+++ b/backend/include/rcc/CodeGen/GlobalObject.h
@@ -156,6 +156,15 @@ enum class GlobalUnnamedAddress : std::uint8_t {
Count,
};
+struct GlobalValueProperties final {
+ bool DSOLocal = false;
+ bool ExternalWeak = false;
+ bool ThreadLocal = false;
+
+ friend constexpr bool operator==(const GlobalValueProperties &Left,
+ const GlobalValueProperties &Right) noexcept = default;
+};
+
struct GlobalObjectDesc final {
std::string Symbol;
GenericConstantType ObjectType;
diff --git a/backend/include/rcc/CodeGen/InstructionDescriptor.h b/backend/include/rcc/CodeGen/InstructionDescriptor.h
index ccd1b63..91881e6 100644
--- a/backend/include/rcc/CodeGen/InstructionDescriptor.h
+++ b/backend/include/rcc/CodeGen/InstructionDescriptor.h
@@ -195,6 +195,7 @@ enum class PseudoOwner : std::uint8_t {
InstructionSelect,
PhiElimination,
TwoAddressRewrite,
+ PreRAExpansion,
RegisterAllocator,
PrePEIExpansion,
PrologueEpilogueInsertion,
diff --git a/backend/include/rcc/CodeGen/MIRParser/MIParser.h b/backend/include/rcc/CodeGen/MIRParser/MIParser.h
index 0b888e5..cd40882 100644
--- a/backend/include/rcc/CodeGen/MIRParser/MIParser.h
+++ b/backend/include/rcc/CodeGen/MIRParser/MIParser.h
@@ -5,6 +5,7 @@
#include "rcc/CodeGen/MachineIRTypes.h"
#include "rcc/CodeGen/MachineMetadata.h"
+#include "rcc/CodeGen/GlobalObject.h"
#include "rcc/CodeGen/Register.h"
#include "rcc/Support/Error.h"
#include "rcc/Support/TextDiagnostic.h"
@@ -66,6 +67,7 @@ struct MIParserContext final {
std::vector<MIMetadataSlot> Metadata;
std::vector<MISyncScopeSlot> SyncScopes;
std::function<bool(std::string_view)> HasIRBlock;
+ std::function<GlobalValueProperties(std::string_view)> GlobalValuePropertiesForName;
std::function<Expected<SyncScopeID>(std::string_view)> InternSyncScope;
std::function<Expected<std::uint32_t>(std::uint32_t)> PointerSizeInBits;
};
diff --git a/backend/include/rcc/CodeGen/MachineOperand.h b/backend/include/rcc/CodeGen/MachineOperand.h
index 1f321b0..d82e41a 100644
--- a/backend/include/rcc/CodeGen/MachineOperand.h
+++ b/backend/include/rcc/CodeGen/MachineOperand.h
@@ -5,6 +5,7 @@
#include "rcc/ADT/APFloat.h"
#include "rcc/ADT/APInt.h"
+#include "rcc/CodeGen/GlobalObject.h"
#include "rcc/CodeGen/LowLevelType.h"
#include "rcc/CodeGen/MachineDebugInfo.h"
#include "rcc/CodeGen/MachineIRTypes.h"
@@ -127,6 +128,7 @@ struct JumpTableOperand final {
struct GlobalSymbolOperand final {
std::string Name;
std::int64_t Offset = 0;
+ GlobalValueProperties Properties;
friend bool operator==(const GlobalSymbolOperand &Left,
const GlobalSymbolOperand &Right) = default;
@@ -329,7 +331,8 @@ public:
[[nodiscard]] static MachineOperand jumpTable(JumpTableIndex Index,
std::uint32_t TargetFlags = 0);
[[nodiscard]] static Expected<MachineOperand>
- globalSymbol(std::string Name, std::int64_t Offset = 0, std::uint32_t TargetFlags = 0);
+ globalSymbol(std::string Name, std::int64_t Offset = 0, std::uint32_t TargetFlags = 0,
+ GlobalValueProperties Properties = {});
[[nodiscard]] static Expected<MachineOperand>
externalSymbol(std::string Name, std::int64_t Offset = 0, std::uint32_t TargetFlags = 0);
[[nodiscard]] static Expected<MachineOperand> blockAddress(std::string FunctionName,
diff --git a/backend/include/rcc/CodeGen/MachinePseudoExpansion.h b/backend/include/rcc/CodeGen/MachinePseudoExpansion.h
index 7d4b309..c30ba50 100644
--- a/backend/include/rcc/CodeGen/MachinePseudoExpansion.h
+++ b/backend/include/rcc/CodeGen/MachinePseudoExpansion.h
@@ -11,6 +11,20 @@ namespace rcc {
class TargetInstrInfo;
class TargetPseudoExpansionInfo;
+class PreRATargetPseudoExpansionPass final : public MachineFunctionPass {
+public:
+ explicit PreRATargetPseudoExpansionPass(const TargetPseudoExpansionInfo &Info) noexcept
+ : Info(&Info) {}
+
+ [[nodiscard]] const MachinePassContract &contract() const noexcept override;
+ [[nodiscard]] Expected<MachinePassResult> run(MachineFunction &Function,
+ const TargetDescription &Target,
+ MachineFunctionAnalysisManager &Analyses) override;
+
+private:
+ const TargetPseudoExpansionInfo *Info;
+};
+
class PreparePostRAPseudosPass final : public MachineFunctionPass {
public:
explicit PreparePostRAPseudosPass(const TargetPseudoExpansionInfo &Info) noexcept : Info(&Info) {}
diff --git a/backend/include/rcc/CodeGen/TargetPseudoExpansion.h b/backend/include/rcc/CodeGen/TargetPseudoExpansion.h
index 4d9f556..5135d78 100644
--- a/backend/include/rcc/CodeGen/TargetPseudoExpansion.h
+++ b/backend/include/rcc/CodeGen/TargetPseudoExpansion.h
@@ -14,6 +14,7 @@ class MachineInstr;
class TargetDescription;
enum class MachinePseudoExpansionPhase : std::uint8_t {
+ PreRA,
PrePEI,
PostRA,
TargetLate,
diff --git a/backend/include/rcc/MIR/EmbeddedIR.h b/backend/include/rcc/MIR/EmbeddedIR.h
index 99f1493..1c17938 100644
--- a/backend/include/rcc/MIR/EmbeddedIR.h
+++ b/backend/include/rcc/MIR/EmbeddedIR.h
@@ -3,6 +3,7 @@
#ifndef RCC_MIR_EMBEDDEDIR_H
#define RCC_MIR_EMBEDDEDIR_H
+#include "rcc/CodeGen/GlobalObject.h"
#include "rcc/Support/TextDiagnostic.h"
#include <cstddef>
@@ -141,6 +142,8 @@ public:
[[nodiscard]] const EmbeddedIRFunction *function(std::string_view Name) const noexcept;
[[nodiscard]] const EmbeddedIRFunction *unnamedFunction(std::size_t Ordinal) const noexcept;
[[nodiscard]] const EmbeddedIRReference *globalObject(std::string_view Name) const noexcept;
+ [[nodiscard]] std::optional<GlobalValueProperties>
+ globalObjectProperties(std::string_view Name) const noexcept;
[[nodiscard]] const EmbeddedIRMetadataDefinition *metadata(std::string_view Name) const noexcept;
[[nodiscard]] const EmbeddedIRTypeDefinition *
typeDefinition(std::string_view Name) const noexcept;
@@ -167,6 +170,8 @@ private:
std::optional<TextRange> DataLayoutRange;
std::vector<EmbeddedIRFunction> Functions;
std::vector<EmbeddedIRReference> GlobalObjects;
+ std::unordered_map<std::string, GlobalValueProperties, StringHash, std::equal_to<> >
+ GlobalProperties;
std::vector<EmbeddedIRMetadataDefinition> MetadataDefinitions;
std::vector<EmbeddedIRTypeDefinition> TypeDefinitions;
std::unordered_map<std::string, std::size_t, StringHash, std::equal_to<>> FunctionNameToIndex;
diff --git a/backend/include/rcc/Target/RISCV/RISCVFixupKinds.h b/backend/include/rcc/Target/RISCV/RISCVFixupKinds.h
index 7e9c8a2..e030bfc 100644
--- a/backend/include/rcc/Target/RISCV/RISCVFixupKinds.h
+++ b/backend/include/rcc/Target/RISCV/RISCVFixupKinds.h
@@ -14,6 +14,7 @@ enum class RISCVFixupKind : mc::MCFixupKind {
Low12I,
Low12S,
PCRelativeHigh20,
+ GOTPCRelativeHigh20,
PCRelativeLow12I,
PCRelativeLow12S,
JAL,
diff --git a/backend/include/rcc/Target/RISCV/RISCVInstPrinter.h b/backend/include/rcc/Target/RISCV/RISCVInstPrinter.h
index 1b80218..7e74ab2 100644
--- a/backend/include/rcc/Target/RISCV/RISCVInstPrinter.h
+++ b/backend/include/rcc/Target/RISCV/RISCVInstPrinter.h
@@ -18,6 +18,7 @@ enum class RISCVMCExprKind : std::uint32_t {
PCRelativeLow = 3,
AbsoluteHigh = 4,
AbsoluteLow = 5,
+ GOTPCRelativeHigh = 6,
};
class RISCVInstPrinter final : public mc::MCInstPrinter {
diff --git a/backend/include/rcc/Target/RISCV/RISCVSubtarget.h b/backend/include/rcc/Target/RISCV/RISCVSubtarget.h
index c590be6..a77a045 100644
--- a/backend/include/rcc/Target/RISCV/RISCVSubtarget.h
+++ b/backend/include/rcc/Target/RISCV/RISCVSubtarget.h
@@ -3,6 +3,7 @@
#ifndef RCC_TARGET_RISCV_RISCVSUBTARGET_H
#define RCC_TARGET_RISCV_RISCVSUBTARGET_H
+#include "rcc/CodeGen/CommandFlags.h"
#include "rcc/Support/Error.h"
#include <cstdint>
@@ -88,7 +89,9 @@ private:
class RISCVSubtarget final {
public:
- explicit RISCVSubtarget(RISCVSubtargetFeatures Features);
+ explicit RISCVSubtarget(RISCVSubtargetFeatures Features,
+ RelocationModel Relocation = RelocationModel::Static,
+ CodeModel Code = CodeModel::Small);
RISCVSubtarget(const RISCVSubtarget &) = delete;
RISCVSubtarget &operator=(const RISCVSubtarget &) = delete;
RISCVSubtarget(RISCVSubtarget &&) = delete;
@@ -99,6 +102,14 @@ public:
return Features;
}
+ [[nodiscard]] RelocationModel relocationModel() const noexcept {
+ return Relocation;
+ }
+
+ [[nodiscard]] CodeModel codeModel() const noexcept {
+ return Code;
+ }
+
[[nodiscard]] const TargetCallLowering *getCallLowering() const;
[[nodiscard]] InstructionSelector *getInstructionSelector() const;
[[nodiscard]] const LegalizerInfo *getLegalizerInfo() const;
@@ -106,6 +117,8 @@ public:
private:
RISCVSubtargetFeatures Features;
+ RelocationModel Relocation;
+ CodeModel Code;
mutable std::unique_ptr<TargetCallLowering> CallLoweringInfo;
mutable std::unique_ptr<InstructionSelector> InstSelector;
mutable std::unique_ptr<LegalizerInfo> Legalizer;
diff --git a/backend/include/rcc/Tooling/BackendInvocation.h b/backend/include/rcc/Tooling/BackendInvocation.h
index d61f038..504dc3a 100644
--- a/backend/include/rcc/Tooling/BackendInvocation.h
+++ b/backend/include/rcc/Tooling/BackendInvocation.h
@@ -55,7 +55,7 @@ struct BackendInvocation final {
std::vector<std::string> Features;
std::string ABI;
std::string DataLayout;
- rcc::RelocationModel Relocation = rcc::RelocationModel::PositionIndependent;
+ rcc::RelocationModel Relocation = rcc::RelocationModel::Static;
rcc::CodeModel Code = rcc::CodeModel::Small;
std::vector<BackendOption> TargetOptions;
LayoutOwnership Layout = LayoutOwnership::NativeObject;