xref: /freebsd/contrib/llvm-project/llvm/lib/Target/BPF/BPFSubtarget.cpp (revision 480093f4440d54b30b3025afeac24b48f2ba7a2e)
10b57cec5SDimitry Andric //===-- BPFSubtarget.cpp - BPF Subtarget Information ----------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This file implements the BPF specific subclass of TargetSubtargetInfo.
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric #include "BPFSubtarget.h"
140b57cec5SDimitry Andric #include "BPF.h"
150b57cec5SDimitry Andric #include "llvm/Support/Host.h"
160b57cec5SDimitry Andric #include "llvm/Support/TargetRegistry.h"
170b57cec5SDimitry Andric 
180b57cec5SDimitry Andric using namespace llvm;
190b57cec5SDimitry Andric 
200b57cec5SDimitry Andric #define DEBUG_TYPE "bpf-subtarget"
210b57cec5SDimitry Andric 
220b57cec5SDimitry Andric #define GET_SUBTARGETINFO_TARGET_DESC
230b57cec5SDimitry Andric #define GET_SUBTARGETINFO_CTOR
240b57cec5SDimitry Andric #include "BPFGenSubtargetInfo.inc"
250b57cec5SDimitry Andric 
260b57cec5SDimitry Andric void BPFSubtarget::anchor() {}
270b57cec5SDimitry Andric 
280b57cec5SDimitry Andric BPFSubtarget &BPFSubtarget::initializeSubtargetDependencies(StringRef CPU,
290b57cec5SDimitry Andric                                                             StringRef FS) {
300b57cec5SDimitry Andric   initializeEnvironment();
310b57cec5SDimitry Andric   initSubtargetFeatures(CPU, FS);
320b57cec5SDimitry Andric   ParseSubtargetFeatures(CPU, FS);
330b57cec5SDimitry Andric   return *this;
340b57cec5SDimitry Andric }
350b57cec5SDimitry Andric 
360b57cec5SDimitry Andric void BPFSubtarget::initializeEnvironment() {
370b57cec5SDimitry Andric   HasJmpExt = false;
380b57cec5SDimitry Andric   HasJmp32 = false;
390b57cec5SDimitry Andric   HasAlu32 = false;
400b57cec5SDimitry Andric   UseDwarfRIS = false;
410b57cec5SDimitry Andric }
420b57cec5SDimitry Andric 
430b57cec5SDimitry Andric void BPFSubtarget::initSubtargetFeatures(StringRef CPU, StringRef FS) {
440b57cec5SDimitry Andric   if (CPU == "probe")
450b57cec5SDimitry Andric     CPU = sys::detail::getHostCPUNameForBPF();
460b57cec5SDimitry Andric   if (CPU == "generic" || CPU == "v1")
470b57cec5SDimitry Andric     return;
480b57cec5SDimitry Andric   if (CPU == "v2") {
490b57cec5SDimitry Andric     HasJmpExt = true;
500b57cec5SDimitry Andric     return;
510b57cec5SDimitry Andric   }
520b57cec5SDimitry Andric   if (CPU == "v3") {
530b57cec5SDimitry Andric     HasJmpExt = true;
540b57cec5SDimitry Andric     HasJmp32 = true;
55*480093f4SDimitry Andric     HasAlu32 = true;
560b57cec5SDimitry Andric     return;
570b57cec5SDimitry Andric   }
580b57cec5SDimitry Andric }
590b57cec5SDimitry Andric 
600b57cec5SDimitry Andric BPFSubtarget::BPFSubtarget(const Triple &TT, const std::string &CPU,
610b57cec5SDimitry Andric                            const std::string &FS, const TargetMachine &TM)
620b57cec5SDimitry Andric     : BPFGenSubtargetInfo(TT, CPU, FS), InstrInfo(),
630b57cec5SDimitry Andric       FrameLowering(initializeSubtargetDependencies(CPU, FS)),
640b57cec5SDimitry Andric       TLInfo(TM, *this) {}
65