Define function MipsGetSymAndOffset which returns a fixup's symbol and the

offset applied to it.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@153493 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Akira Hatanaka 2012-03-27 02:04:18 +00:00
parent d6c2355789
commit d7edf7edd4

View File

@ -14,7 +14,9 @@
#ifndef MIPSBASEINFO_H
#define MIPSBASEINFO_H
#include "MipsFixupKinds.h"
#include "MipsMCTargetDesc.h"
#include "llvm/MC/MCExpr.h"
#include "llvm/Support/DataTypes.h"
#include "llvm/Support/ErrorHandling.h"
@ -198,6 +200,34 @@ inline static unsigned getMipsRegisterNumbering(unsigned RegEnum)
default: llvm_unreachable("Unknown register number!");
}
}
inline static std::pair<const MCSymbolRefExpr*, int64_t>
MipsGetSymAndOffset(const MCFixup &Fixup) {
MCFixupKind FixupKind = Fixup.getKind();
if ((FixupKind < FirstTargetFixupKind) ||
(FixupKind >= MCFixupKind(Mips::LastTargetFixupKind)))
return std::make_pair((const MCSymbolRefExpr*)0, (int64_t)0);
const MCExpr *Expr = Fixup.getValue();
MCExpr::ExprKind Kind = Expr->getKind();
if (Kind == MCExpr::Binary) {
const MCBinaryExpr *BE = static_cast<const MCBinaryExpr*>(Expr);
const MCExpr *LHS = BE->getLHS();
const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(BE->getRHS());
if ((LHS->getKind() != MCExpr::SymbolRef) || !CE)
return std::make_pair((const MCSymbolRefExpr*)0, (int64_t)0);
return std::make_pair(cast<MCSymbolRefExpr>(LHS), CE->getValue());
}
if (Kind != MCExpr::SymbolRef)
return std::make_pair((const MCSymbolRefExpr*)0, (int64_t)0);
return std::make_pair(cast<MCSymbolRefExpr>(Expr), 0);
}
}
#endif