1fc77014f24b60e2150e17cd87bb04280757e1a65Jia Liu//===-- MipsBaseInfo.h - Top level definitions for MIPS MC ------*- C++ -*-===// 291d2cc9cdd5f5c5fa89b4efa75217c96cbd38356Akira Hatanaka// 391d2cc9cdd5f5c5fa89b4efa75217c96cbd38356Akira Hatanaka// The LLVM Compiler Infrastructure 491d2cc9cdd5f5c5fa89b4efa75217c96cbd38356Akira Hatanaka// 591d2cc9cdd5f5c5fa89b4efa75217c96cbd38356Akira Hatanaka// This file is distributed under the University of Illinois Open Source 691d2cc9cdd5f5c5fa89b4efa75217c96cbd38356Akira Hatanaka// License. See LICENSE.TXT for details. 791d2cc9cdd5f5c5fa89b4efa75217c96cbd38356Akira Hatanaka// 891d2cc9cdd5f5c5fa89b4efa75217c96cbd38356Akira Hatanaka//===----------------------------------------------------------------------===// 991d2cc9cdd5f5c5fa89b4efa75217c96cbd38356Akira Hatanaka// 1091d2cc9cdd5f5c5fa89b4efa75217c96cbd38356Akira Hatanaka// This file contains small standalone helper functions and enum definitions for 1191d2cc9cdd5f5c5fa89b4efa75217c96cbd38356Akira Hatanaka// the Mips target useful for the compiler back-end and the MC libraries. 1291d2cc9cdd5f5c5fa89b4efa75217c96cbd38356Akira Hatanaka// 1391d2cc9cdd5f5c5fa89b4efa75217c96cbd38356Akira Hatanaka//===----------------------------------------------------------------------===// 1491d2cc9cdd5f5c5fa89b4efa75217c96cbd38356Akira Hatanaka#ifndef MIPSBASEINFO_H 1591d2cc9cdd5f5c5fa89b4efa75217c96cbd38356Akira Hatanaka#define MIPSBASEINFO_H 1691d2cc9cdd5f5c5fa89b4efa75217c96cbd38356Akira Hatanaka 17d7edf7edd4bdd372a6fc2582632ffe6fa935f980Akira Hatanaka#include "MipsFixupKinds.h" 1891d2cc9cdd5f5c5fa89b4efa75217c96cbd38356Akira Hatanaka#include "MipsMCTargetDesc.h" 19d7edf7edd4bdd372a6fc2582632ffe6fa935f980Akira Hatanaka#include "llvm/MC/MCExpr.h" 2091d2cc9cdd5f5c5fa89b4efa75217c96cbd38356Akira Hatanaka#include "llvm/Support/DataTypes.h" 2191d2cc9cdd5f5c5fa89b4efa75217c96cbd38356Akira Hatanaka#include "llvm/Support/ErrorHandling.h" 2291d2cc9cdd5f5c5fa89b4efa75217c96cbd38356Akira Hatanaka 2391d2cc9cdd5f5c5fa89b4efa75217c96cbd38356Akira Hatanakanamespace llvm { 2447b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes 2547b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes/// MipsII - This namespace holds all of the target specific flags that 2647b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes/// instruction info tracks. 2747b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes/// 2847b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopesnamespace MipsII { 2947b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes /// Target Operand Flag enum. 3047b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes enum TOF { 3147b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes //===------------------------------------------------------------------===// 3247b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes // Mips Specific MachineOperand flags. 3347b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes 3447b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes MO_NO_FLAG, 3547b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes 36e3d3572e282733bd7aa5ac14115ed0804174e426Bruno Cardoso Lopes /// MO_GOT16 - Represents the offset into the global offset table at which 3747b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes /// the address the relocation entry symbol resides during execution. 38e3d3572e282733bd7aa5ac14115ed0804174e426Bruno Cardoso Lopes MO_GOT16, 3947b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes MO_GOT, 4047b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes 4147b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes /// MO_GOT_CALL - Represents the offset into the global offset table at 4247b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes /// which the address of a call site relocation entry symbol resides 4347b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes /// during execution. This is different from the above since this flag 4447b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes /// can only be present in call instructions. 4547b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes MO_GOT_CALL, 4647b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes 4747b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes /// MO_GPREL - Represents the offset from the current gp value to be used 4847b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes /// for the relocatable object file being produced. 4947b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes MO_GPREL, 5047b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes 5147b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes /// MO_ABS_HI/LO - Represents the hi or low part of an absolute symbol 5247b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes /// address. 5347b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes MO_ABS_HI, 5447b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes MO_ABS_LO, 5547b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes 5647b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes /// MO_TLSGD - Represents the offset into the global offset table at which 5747b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes // the module ID and TSL block offset reside during execution (General 5847b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes // Dynamic TLS). 5947b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes MO_TLSGD, 6047b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes 613faac0a78c7a70d3dcd2af102a132bb9da2d639cAkira Hatanaka /// MO_TLSLDM - Represents the offset into the global offset table at which 623faac0a78c7a70d3dcd2af102a132bb9da2d639cAkira Hatanaka // the module ID and TSL block offset reside during execution (Local 633faac0a78c7a70d3dcd2af102a132bb9da2d639cAkira Hatanaka // Dynamic TLS). 643faac0a78c7a70d3dcd2af102a132bb9da2d639cAkira Hatanaka MO_TLSLDM, 653faac0a78c7a70d3dcd2af102a132bb9da2d639cAkira Hatanaka MO_DTPREL_HI, 663faac0a78c7a70d3dcd2af102a132bb9da2d639cAkira Hatanaka MO_DTPREL_LO, 673faac0a78c7a70d3dcd2af102a132bb9da2d639cAkira Hatanaka 6847b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes /// MO_GOTTPREL - Represents the offset from the thread pointer (Initial 6947b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes // Exec TLS). 7047b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes MO_GOTTPREL, 7147b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes 7247b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes /// MO_TPREL_HI/LO - Represents the hi and low part of the offset from 7347b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes // the thread pointer (Local Exec TLS). 7447b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes MO_TPREL_HI, 7547b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes MO_TPREL_LO, 7647b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes 7747b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes // N32/64 Flags. 7847b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes MO_GPOFF_HI, 7947b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes MO_GPOFF_LO, 8047b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes MO_GOT_DISP, 8147b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes MO_GOT_PAGE, 82b22c9289b0dd8255f63038e9bb8229111eb082aeAkira Hatanaka MO_GOT_OFST, 83b22c9289b0dd8255f63038e9bb8229111eb082aeAkira Hatanaka 84ec5e97f5c874a82aa995cffee8c5592c6689ffb4Akira Hatanaka /// MO_HIGHER/HIGHEST - Represents the highest or higher half word of a 85ec5e97f5c874a82aa995cffee8c5592c6689ffb4Akira Hatanaka /// 64-bit symbol address. 86b22c9289b0dd8255f63038e9bb8229111eb082aeAkira Hatanaka MO_HIGHER, 8726e6ad7b290abd4e5dcae1c6fbd5cae77a4beffeAkira Hatanaka MO_HIGHEST, 8826e6ad7b290abd4e5dcae1c6fbd5cae77a4beffeAkira Hatanaka 8926e6ad7b290abd4e5dcae1c6fbd5cae77a4beffeAkira Hatanaka /// MO_GOT_HI16/LO16, MO_CALL_HI16/LO16 - Relocations used for large GOTs. 9026e6ad7b290abd4e5dcae1c6fbd5cae77a4beffeAkira Hatanaka MO_GOT_HI16, 9126e6ad7b290abd4e5dcae1c6fbd5cae77a4beffeAkira Hatanaka MO_GOT_LO16, 9226e6ad7b290abd4e5dcae1c6fbd5cae77a4beffeAkira Hatanaka MO_CALL_HI16, 9326e6ad7b290abd4e5dcae1c6fbd5cae77a4beffeAkira Hatanaka MO_CALL_LO16 9447b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes }; 9547b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes 9647b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes enum { 9747b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes //===------------------------------------------------------------------===// 9847b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes // Instruction encodings. These are the standard/most common forms for 9947b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes // Mips instructions. 10047b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes // 10147b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes 10247b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes // Pseudo - This represents an instruction that is a pseudo instruction 10347b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes // or one that has not been implemented yet. It is illegal to code generate 10447b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes // it, but tolerated for intermediate implementation stages. 10547b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes Pseudo = 0, 10647b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes 10747b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes /// FrmR - This form is for instructions of the format R. 10847b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes FrmR = 1, 10947b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes /// FrmI - This form is for instructions of the format I. 11047b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes FrmI = 2, 11147b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes /// FrmJ - This form is for instructions of the format J. 11247b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes FrmJ = 3, 11347b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes /// FrmFR - This form is for instructions of the format FR. 11447b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes FrmFR = 4, 11547b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes /// FrmFI - This form is for instructions of the format FI. 11647b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes FrmFI = 5, 11747b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes /// FrmOther - This form is for instructions that have no specific format. 11847b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes FrmOther = 6, 11947b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes 12047b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes FormMask = 15 12147b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes }; 12247b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes} 12347b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes 124d7edf7edd4bdd372a6fc2582632ffe6fa935f980Akira Hatanakainline static std::pair<const MCSymbolRefExpr*, int64_t> 125d7edf7edd4bdd372a6fc2582632ffe6fa935f980Akira HatanakaMipsGetSymAndOffset(const MCFixup &Fixup) { 126d7edf7edd4bdd372a6fc2582632ffe6fa935f980Akira Hatanaka MCFixupKind FixupKind = Fixup.getKind(); 127d7edf7edd4bdd372a6fc2582632ffe6fa935f980Akira Hatanaka 128d7edf7edd4bdd372a6fc2582632ffe6fa935f980Akira Hatanaka if ((FixupKind < FirstTargetFixupKind) || 129d7edf7edd4bdd372a6fc2582632ffe6fa935f980Akira Hatanaka (FixupKind >= MCFixupKind(Mips::LastTargetFixupKind))) 130d7edf7edd4bdd372a6fc2582632ffe6fa935f980Akira Hatanaka return std::make_pair((const MCSymbolRefExpr*)0, (int64_t)0); 131d7edf7edd4bdd372a6fc2582632ffe6fa935f980Akira Hatanaka 132d7edf7edd4bdd372a6fc2582632ffe6fa935f980Akira Hatanaka const MCExpr *Expr = Fixup.getValue(); 133d7edf7edd4bdd372a6fc2582632ffe6fa935f980Akira Hatanaka MCExpr::ExprKind Kind = Expr->getKind(); 134d7edf7edd4bdd372a6fc2582632ffe6fa935f980Akira Hatanaka 135d7edf7edd4bdd372a6fc2582632ffe6fa935f980Akira Hatanaka if (Kind == MCExpr::Binary) { 136d7edf7edd4bdd372a6fc2582632ffe6fa935f980Akira Hatanaka const MCBinaryExpr *BE = static_cast<const MCBinaryExpr*>(Expr); 137d7edf7edd4bdd372a6fc2582632ffe6fa935f980Akira Hatanaka const MCExpr *LHS = BE->getLHS(); 138d7edf7edd4bdd372a6fc2582632ffe6fa935f980Akira Hatanaka const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(BE->getRHS()); 139d7edf7edd4bdd372a6fc2582632ffe6fa935f980Akira Hatanaka 140d7edf7edd4bdd372a6fc2582632ffe6fa935f980Akira Hatanaka if ((LHS->getKind() != MCExpr::SymbolRef) || !CE) 141d7edf7edd4bdd372a6fc2582632ffe6fa935f980Akira Hatanaka return std::make_pair((const MCSymbolRefExpr*)0, (int64_t)0); 142d7edf7edd4bdd372a6fc2582632ffe6fa935f980Akira Hatanaka 143d7edf7edd4bdd372a6fc2582632ffe6fa935f980Akira Hatanaka return std::make_pair(cast<MCSymbolRefExpr>(LHS), CE->getValue()); 144d7edf7edd4bdd372a6fc2582632ffe6fa935f980Akira Hatanaka } 145d7edf7edd4bdd372a6fc2582632ffe6fa935f980Akira Hatanaka 146d7edf7edd4bdd372a6fc2582632ffe6fa935f980Akira Hatanaka if (Kind != MCExpr::SymbolRef) 147d7edf7edd4bdd372a6fc2582632ffe6fa935f980Akira Hatanaka return std::make_pair((const MCSymbolRefExpr*)0, (int64_t)0); 148d7edf7edd4bdd372a6fc2582632ffe6fa935f980Akira Hatanaka 149d7edf7edd4bdd372a6fc2582632ffe6fa935f980Akira Hatanaka return std::make_pair(cast<MCSymbolRefExpr>(Expr), 0); 150d7edf7edd4bdd372a6fc2582632ffe6fa935f980Akira Hatanaka} 15191d2cc9cdd5f5c5fa89b4efa75217c96cbd38356Akira Hatanaka} 15291d2cc9cdd5f5c5fa89b4efa75217c96cbd38356Akira Hatanaka 15391d2cc9cdd5f5c5fa89b4efa75217c96cbd38356Akira Hatanaka#endif 154