Coverage Report

Created: 2025-11-16 07:15

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/keystone/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCTargetDesc.cpp
Line
Count
Source
1
//===-- HexagonMCTargetDesc.cpp - Hexagon Target Descriptions -------------===//
2
//
3
//                     The LLVM Compiler Infrastructure
4
//
5
// This file is distributed under the University of Illinois Open Source
6
// License. See LICENSE.TXT for details.
7
//
8
//===----------------------------------------------------------------------===//
9
//
10
// This file provides Hexagon specific target descriptions.
11
//
12
//===----------------------------------------------------------------------===//
13
14
#include "HexagonMCTargetDesc.h"
15
#include "Hexagon.h"
16
#include "HexagonMCAsmInfo.h"
17
#include "HexagonMCELFStreamer.h"
18
#include "llvm/ADT/STLExtras.h"
19
#include "llvm/MC/MCContext.h"
20
#include "llvm/MC/MCELFStreamer.h"
21
#include "llvm/MC/MCInstrInfo.h"
22
#include "llvm/MC/MCObjectStreamer.h"
23
#include "llvm/MC/MCRegisterInfo.h"
24
#include "llvm/MC/MCStreamer.h"
25
#include "llvm/MC/MCSubtargetInfo.h"
26
#include "llvm/MC/MachineLocation.h"
27
#include "llvm/Support/ELF.h"
28
#include "llvm/Support/ErrorHandling.h"
29
#include "llvm/Support/TargetRegistry.h"
30
31
using namespace llvm_ks;
32
33
#define GET_INSTRINFO_MC_DESC
34
#include "HexagonGenInstrInfo.inc"
35
36
#define GET_SUBTARGETINFO_MC_DESC
37
#include "HexagonGenSubtargetInfo.inc"
38
39
#define GET_REGINFO_MC_DESC
40
#include "HexagonGenRegisterInfo.inc"
41
42
bool llvm_ks::HexagonDisableCompound;
43
44
bool llvm_ks::HexagonDisableDuplex;
45
46
3.01k
StringRef HEXAGON_MC::selectHexagonCPU(const Triple &TT, StringRef CPU) {
47
3.01k
  if (CPU.empty())
48
3.01k
    CPU = "hexagonv60";
49
3.01k
  return CPU;
50
3.01k
}
51
52
6.02k
MCInstrInfo *llvm_ks::createHexagonMCInstrInfo() {
53
6.02k
  MCInstrInfo *X = new MCInstrInfo();
54
6.02k
  InitHexagonMCInstrInfo(X);
55
6.02k
  return X;
56
6.02k
}
57
58
3.01k
static MCRegisterInfo *createHexagonMCRegisterInfo(const Triple &TT) {
59
3.01k
  MCRegisterInfo *X = new MCRegisterInfo();
60
3.01k
  InitHexagonMCRegisterInfo(X, Hexagon::R0);
61
3.01k
  return X;
62
3.01k
}
63
64
static MCSubtargetInfo *
65
3.01k
createHexagonMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS) {
66
3.01k
  CPU = HEXAGON_MC::selectHexagonCPU(TT, CPU);
67
3.01k
  return createHexagonMCSubtargetInfoImpl(TT, CPU, FS);
68
3.01k
}
69
70
namespace {
71
class HexagonTargetELFStreamer : public HexagonTargetStreamer {
72
public:
73
0
  MCELFStreamer &getStreamer() {
74
0
    return static_cast<MCELFStreamer &>(Streamer);
75
0
  }
76
  HexagonTargetELFStreamer(MCStreamer &S, MCSubtargetInfo const &STI)
77
0
      : HexagonTargetStreamer(S) {
78
0
    auto Bits = STI.getFeatureBits();
79
0
    unsigned Flags;
80
0
    if (Bits.to_ullong() & llvm_ks::Hexagon::ArchV5)
81
0
      Flags = ELF::EF_HEXAGON_MACH_V5;
82
0
    else
83
0
      Flags = ELF::EF_HEXAGON_MACH_V4;
84
0
    getStreamer().getAssembler().setELFHeaderEFlags(Flags);
85
0
  }
86
  void EmitCommonSymbolSorted(MCSymbol *Symbol, uint64_t Size,
87
                              unsigned ByteAlignment,
88
0
                              unsigned AccessSize) override {
89
0
    HexagonMCELFStreamer &HexagonELFStreamer =
90
0
        static_cast<HexagonMCELFStreamer &>(getStreamer());
91
0
    HexagonELFStreamer.HexagonMCEmitCommonSymbol(Symbol, Size, ByteAlignment,
92
0
                                                 AccessSize);
93
0
  }
94
  void EmitLocalCommonSymbolSorted(MCSymbol *Symbol, uint64_t Size,
95
                                   unsigned ByteAlignment,
96
0
                                   unsigned AccessSize) override {
97
0
    HexagonMCELFStreamer &HexagonELFStreamer =
98
0
        static_cast<HexagonMCELFStreamer &>(getStreamer());
99
0
    HexagonELFStreamer.HexagonMCEmitLocalCommonSymbol(
100
0
        Symbol, Size, ByteAlignment, AccessSize);
101
0
  }
102
};
103
}
104
105
static MCAsmInfo *createHexagonMCAsmInfo(const MCRegisterInfo &MRI,
106
3.01k
                                         const Triple &TT) {
107
3.01k
  MCAsmInfo *MAI = new HexagonMCAsmInfo(TT);
108
109
  // VirtualFP = (R30 + #0).
110
3.01k
  MCCFIInstruction Inst =
111
3.01k
      MCCFIInstruction::createDefCfa(nullptr, Hexagon::R30, 0);
112
3.01k
  MAI->addInitialFrameState(Inst);
113
114
3.01k
  return MAI;
115
3.01k
}
116
117
// Force static initialization.
118
25
extern "C" void LLVMInitializeHexagonTargetMC() {
119
  // Register the MC asm info.
120
25
  RegisterMCAsmInfoFn X(TheHexagonTarget, createHexagonMCAsmInfo);
121
122
  // Register the MC instruction info.
123
25
  TargetRegistry::RegisterMCInstrInfo(TheHexagonTarget,
124
25
                                      createHexagonMCInstrInfo);
125
126
  // Register the MC register info.
127
25
  TargetRegistry::RegisterMCRegInfo(TheHexagonTarget,
128
25
                                    createHexagonMCRegisterInfo);
129
130
  // Register the MC subtarget info.
131
25
  TargetRegistry::RegisterMCSubtargetInfo(TheHexagonTarget,
132
25
                                          createHexagonMCSubtargetInfo);
133
134
  // Register the MC Code Emitter
135
25
  TargetRegistry::RegisterMCCodeEmitter(TheHexagonTarget,
136
25
                                        createHexagonMCCodeEmitter);
137
138
  // Register the asm backend
139
25
  TargetRegistry::RegisterMCAsmBackend(TheHexagonTarget,
140
25
                                       createHexagonAsmBackend);
141
25
}