68 lines · c
1//=--- X86MCExpr.h - X86 specific MC expression classes ---*- 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-exception6//7//===----------------------------------------------------------------------===//8//9// This file describes X86-specific MCExprs, i.e, registers used for10// extended variable assignments.11//12//===----------------------------------------------------------------------===//13 14#ifndef LLVM_LIB_TARGET_X86_MCTARGETDESC_X86MCEXPR_H15#define LLVM_LIB_TARGET_X86_MCTARGETDESC_X86MCEXPR_H16 17#include "X86ATTInstPrinter.h"18#include "llvm/MC/MCAsmInfo.h"19#include "llvm/MC/MCContext.h"20#include "llvm/MC/MCExpr.h"21#include "llvm/Support/Casting.h"22#include "llvm/Support/ErrorHandling.h"23 24namespace llvm {25 26class X86MCExpr : public MCTargetExpr {27 28private:29 const MCRegister Reg; // All30 31 explicit X86MCExpr(MCRegister R) : Reg(R) {}32 33public:34 static const X86MCExpr *create(MCRegister Reg, MCContext &Ctx) {35 return new (Ctx) X86MCExpr(Reg);36 }37 38 /// getSubExpr - Get the child of this expression.39 MCRegister getReg() const { return Reg; }40 41 void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override {42 if (!MAI || MAI->getAssemblerDialect() == 0)43 OS << '%';44 OS << X86ATTInstPrinter::getRegisterName(Reg);45 }46 47 bool evaluateAsRelocatableImpl(MCValue &Res,48 const MCAssembler *Asm) const override {49 return false;50 }51 // Register values should be inlined as they are not valid .set expressions.52 bool inlineAssignedExpr() const override { return true; }53 bool isEqualTo(const MCExpr *X) const override {54 if (auto *E = dyn_cast<X86MCExpr>(X))55 return getReg() == E->getReg();56 return false;57 }58 void visitUsedExpr(MCStreamer &Streamer) const override {}59 MCFragment *findAssociatedFragment() const override { return nullptr; }60 61 static bool classof(const MCExpr *E) {62 return E->getKind() == MCExpr::Target;63 }64};65} // end namespace llvm66 67#endif68