1edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand//===-- PPCMCExpr.h - PPC specific MC expression classes --------*- C++ -*-===// 2edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand// 3edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand// The LLVM Compiler Infrastructure 4edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand// 5edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand// This file is distributed under the University of Illinois Open Source 6edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand// License. See LICENSE.TXT for details. 7edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand// 8edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand//===----------------------------------------------------------------------===// 9edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand 1037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_LIB_TARGET_POWERPC_MCTARGETDESC_PPCMCEXPR_H 1137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_LIB_TARGET_POWERPC_MCTARGETDESC_PPCMCEXPR_H 12edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand 1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCAsmLayout.h" 14edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand#include "llvm/MC/MCExpr.h" 15edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand#include "llvm/MC/MCValue.h" 16edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand 17edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigandnamespace llvm { 18edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand 19edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigandclass PPCMCExpr : public MCTargetExpr { 20edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigandpublic: 21edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand enum VariantKind { 22edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand VK_PPC_None, 2392cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand VK_PPC_LO, 24d2849572463da994c685b3bd7a60d5a7566c01e3Ulrich Weigand VK_PPC_HI, 25f7c1ee79fe90353fcd3f545f9d45a01a837bbf4bUlrich Weigand VK_PPC_HA, 26f7c1ee79fe90353fcd3f545f9d45a01a837bbf4bUlrich Weigand VK_PPC_HIGHER, 27f7c1ee79fe90353fcd3f545f9d45a01a837bbf4bUlrich Weigand VK_PPC_HIGHERA, 28f7c1ee79fe90353fcd3f545f9d45a01a837bbf4bUlrich Weigand VK_PPC_HIGHEST, 29f7c1ee79fe90353fcd3f545f9d45a01a837bbf4bUlrich Weigand VK_PPC_HIGHESTA 30edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand }; 31edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand 32edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigandprivate: 33edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand const VariantKind Kind; 34edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand const MCExpr *Expr; 35a68f58ab2bec6a024afae498e4082ddd8b01f178Ulrich Weigand bool IsDarwin; 36edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand 376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar int64_t evaluateAsInt64(int64_t Value) const; 3837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 394c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar explicit PPCMCExpr(VariantKind Kind, const MCExpr *Expr, bool IsDarwin) 404c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar : Kind(Kind), Expr(Expr), IsDarwin(IsDarwin) {} 41edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand 42edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigandpublic: 43edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand /// @name Construction 44edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand /// @{ 45edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand 466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static const PPCMCExpr *create(VariantKind Kind, const MCExpr *Expr, 47a68f58ab2bec6a024afae498e4082ddd8b01f178Ulrich Weigand bool isDarwin, MCContext &Ctx); 48edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand 496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static const PPCMCExpr *createLo(const MCExpr *Expr, 50a68f58ab2bec6a024afae498e4082ddd8b01f178Ulrich Weigand bool isDarwin, MCContext &Ctx) { 516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return create(VK_PPC_LO, Expr, isDarwin, Ctx); 52edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand } 53edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand 546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static const PPCMCExpr *createHi(const MCExpr *Expr, 55a68f58ab2bec6a024afae498e4082ddd8b01f178Ulrich Weigand bool isDarwin, MCContext &Ctx) { 566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return create(VK_PPC_HI, Expr, isDarwin, Ctx); 57d2849572463da994c685b3bd7a60d5a7566c01e3Ulrich Weigand } 58d2849572463da994c685b3bd7a60d5a7566c01e3Ulrich Weigand 596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static const PPCMCExpr *createHa(const MCExpr *Expr, 60a68f58ab2bec6a024afae498e4082ddd8b01f178Ulrich Weigand bool isDarwin, MCContext &Ctx) { 616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return create(VK_PPC_HA, Expr, isDarwin, Ctx); 62edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand } 63edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand 64edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand /// @} 65edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand /// @name Accessors 66edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand /// @{ 67edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand 68edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand /// getOpcode - Get the kind of this expression. 69edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand VariantKind getKind() const { return Kind; } 70edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand 71edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand /// getSubExpr - Get the child of this expression. 72edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand const MCExpr *getSubExpr() const { return Expr; } 73edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand 74027e94479c9e69eb3c3c5536fa9990d0b96e9510Ulrich Weigand /// isDarwinSyntax - True if expression is to be printed using Darwin syntax. 75a68f58ab2bec6a024afae498e4082ddd8b01f178Ulrich Weigand bool isDarwinSyntax() const { return IsDarwin; } 76027e94479c9e69eb3c3c5536fa9990d0b96e9510Ulrich Weigand 77027e94479c9e69eb3c3c5536fa9990d0b96e9510Ulrich Weigand 78edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand /// @} 79edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand 806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override; 816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool evaluateAsRelocatableImpl(MCValue &Res, 8237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const MCAsmLayout *Layout, 8337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const MCFixup *Fixup) const override; 84c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines void visitUsedExpr(MCStreamer &Streamer) const override; 85f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar MCFragment *findAssociatedFragment() const override { 86f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return getSubExpr()->findAssociatedFragment(); 87edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand } 88edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand 89edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand // There are no TLS PPCMCExprs at the moment. 90dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override {} 91edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand 926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool evaluateAsConstant(int64_t &Res) const; 9337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 94edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand static bool classof(const MCExpr *E) { 95edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand return E->getKind() == MCExpr::Target; 96edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand } 97edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand}; 98edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand} // end namespace llvm 99edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand 100edaa58ee66699b99841ee5dfdd485aedbae3bf90Ulrich Weigand#endif 101