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" 15349cc55cSDimitry Andric #include "llvm/MC/TargetRegistry.h" 16*06c3fb27SDimitry Andric #include "llvm/TargetParser/Host.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); 32e8d8bef9SDimitry Andric ParseSubtargetFeatures(CPU, /*TuneCPU*/ 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; 55480093f4SDimitry 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) 6204eeddc0SDimitry Andric : BPFGenSubtargetInfo(TT, CPU, /*TuneCPU*/ CPU, FS), 630b57cec5SDimitry Andric FrameLowering(initializeSubtargetDependencies(CPU, FS)), 640b57cec5SDimitry Andric TLInfo(TM, *this) {} 65