1 //===-- RISCVTargetObjectFile.h - RISCV Object 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 #ifndef LLVM_LIB_TARGET_RISCV_RISCVTARGETOBJECTFILE_H
10 #define LLVM_LIB_TARGET_RISCV_RISCVTARGETOBJECTFILE_H
11 
12 #include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
13 
14 namespace llvm {
15 class RISCVTargetMachine;
16 
17 /// This implementation is used for RISCV ELF targets.
18 class RISCVELFTargetObjectFile : public TargetLoweringObjectFileELF {
19   MCSection *SmallDataSection;
20   MCSection *SmallBSSSection;
21   unsigned SSThreshold = 8;
22 
23 public:
24   void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
25 
26   /// Return true if this global address should be placed into small data/bss
27   /// section.
28   bool isGlobalInSmallSection(const GlobalObject *GO,
29                               const TargetMachine &TM) const;
30 
31   MCSection *SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind,
32                                     const TargetMachine &TM) const override;
33 
34   /// Return true if this constant should be placed into small data section.
35   bool isConstantInSmallSection(const DataLayout &DL, const Constant *CN) const;
36 
37   MCSection *getSectionForConstant(const DataLayout &DL, SectionKind Kind,
38                                    const Constant *C,
39                                    unsigned &Align) const override;
40 
41   void getModuleMetadata(Module &M) override;
42 
43   bool isInSmallSection(uint64_t Size) const;
44 };
45 
46 } // end namespace llvm
47 
48 #endif
49