[llvm] r190598 - Add an instruction deprecation feature to TableGen.
Joey Gouly
joey.gouly at arm.com
Thu Sep 12 07:26:38 PDT 2013
Wow, thanks for that.
I added a test case and fixed this in 190604.
Joey
-----Original Message-----
From: Hal Finkel [mailto:hfinkel at anl.gov]
Sent: 12 September 2013 14:59
To: Joey Gouly
Cc: llvm-commits at cs.uiuc.edu
Subject: Re: [llvm] r190598 - Add an instruction deprecation feature to TableGen.
----- Original Message -----
> Author: joey
> Date: Thu Sep 12 05:28:05 2013
> New Revision: 190598
>
> URL: http://llvm.org/viewvc/llvm-project?rev=190598&view=rev
> Log:
> Add an instruction deprecation feature to TableGen.
>
> The 'Deprecated' class allows you to specify a SubtargetFeature that
> the
> instruction is deprecated on.
Joey,
I don't think this is working quite right... if you run:
llvm-mc -triple armv7 < test/MC/ARM/deprecated-v8.s
then it still prints:
<stdin>:2:1: warning: deprecated
setend be
shouldn't it do this only for armv8?
Thanks again,
Hal
>
> The 'ComplexDeprecationPredicate' class allows you to define a custom
> predicate that is called to check for deprecation.
> For example:
> ComplexDeprecationPredicate<"MCR">
>
> would mean you would have to define the following function:
> bool getMCRDeprecationInfo(MCInst &MI, MCSubtargetInfo &STI,
> std::string &Info)
>
> Which returns 'false' for not deprecated, and 'true' for deprecated
> and store the warning message in 'Info'.
>
> The MCTargetAsmParser constructor was chaned to take an extra
> argument of
> the MCInstrInfo class, so out-of-tree targets will need to be
> changed.
>
>
> Modified:
> llvm/trunk/include/llvm/CodeGen/AsmPrinter.h
> llvm/trunk/include/llvm/MC/MCInstrDesc.h
> llvm/trunk/include/llvm/Support/TargetRegistry.h
> llvm/trunk/include/llvm/Target/Target.td
> llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
> llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp
> llvm/trunk/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
> llvm/trunk/lib/Target/ARM/ARMInstrInfo.td
> llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
> llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
> llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp
> llvm/trunk/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp
> llvm/trunk/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp
> llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp
> llvm/trunk/test/MC/ARM/deprecated-v8.s
> llvm/trunk/tools/llvm-mc/llvm-mc.cpp
> llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp
> llvm/trunk/utils/TableGen/CodeGenInstruction.cpp
> llvm/trunk/utils/TableGen/CodeGenInstruction.h
> llvm/trunk/utils/TableGen/InstrInfoEmitter.cpp
>
> Modified: llvm/trunk/include/llvm/CodeGen/AsmPrinter.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/AsmPrinter.h?rev=190598&r1=190597&r2=190598&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/CodeGen/AsmPrinter.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/AsmPrinter.h Thu Sep 12 05:28:05
> 2013
> @@ -41,6 +41,7 @@ namespace llvm {
> class MCAsmInfo;
> class MCCFIInstruction;
> class MCContext;
> + class MCInstrInfo;
> class MCSection;
> class MCStreamer;
> class MCSymbol;
> @@ -64,6 +65,7 @@ namespace llvm {
> ///
> const MCAsmInfo *MAI;
>
> + const MCInstrInfo *MII;
> /// OutContext - This is the context for the output file that we
> are
> /// streaming. This owns all of the global MC-related objects
> for the
> /// generated translation unit.
>
> Modified: llvm/trunk/include/llvm/MC/MCInstrDesc.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCInstrDesc.h?rev=190598&r1=190597&r2=190598&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCInstrDesc.h (original)
> +++ llvm/trunk/include/llvm/MC/MCInstrDesc.h Thu Sep 12 05:28:05 2013
> @@ -17,6 +17,7 @@
>
> #include "llvm/MC/MCInst.h"
> #include "llvm/MC/MCRegisterInfo.h"
> +#include "llvm/MC/MCSubtargetInfo.h"
> #include "llvm/Support/DataTypes.h"
>
> namespace llvm {
> @@ -145,6 +146,10 @@ public:
> const uint16_t *ImplicitUses; // Registers implicitly read by
> this instr
> const uint16_t *ImplicitDefs; // Registers implicitly defined by
> this instr
> const MCOperandInfo *OpInfo; // 'NumOperands' entries about
> operands
> + uint64_t DeprecatedFeatureMask;// Feature bits that this is
> deprecated on, if any
> + // A complex method to determine is a certain is deprecated or
> not, and return
> + // the reason for deprecation.
> + bool (*ComplexDeprecationInfo)(MCInst &, MCSubtargetInfo &,
> std::string &);
>
> /// \brief Returns the value of the specific constraint if
> /// it is set. Returns -1 if it is not set.
> @@ -158,6 +163,20 @@ public:
> return -1;
> }
>
> + /// \brief Returns true if a certain instruction is deprecated and
> if so
> + /// returns the reason in \p Info.
> + bool getDeprecatedInfo(MCInst &MI, MCSubtargetInfo &STI,
> + std::string &Info) const {
> + if (ComplexDeprecationInfo)
> + return ComplexDeprecationInfo(MI, STI, Info);
> + if (DeprecatedFeatureMask != 0) {
> + // FIXME: it would be nice to include the subtarget feature
> here.
> + Info = "deprecated";
> + return true;
> + }
> + return false;
> + }
> +
> /// \brief Return the opcode number for this descriptor.
> unsigned getOpcode() const {
> return Opcode;
>
> Modified: llvm/trunk/include/llvm/Support/TargetRegistry.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/TargetRegistry.h?rev=190598&r1=190597&r2=190598&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Support/TargetRegistry.h (original)
> +++ llvm/trunk/include/llvm/Support/TargetRegistry.h Thu Sep 12
> 05:28:05 2013
> @@ -108,7 +108,8 @@ namespace llvm {
> StringRef TT,
> StringRef CPU);
> typedef MCTargetAsmParser *(*MCAsmParserCtorTy)(MCSubtargetInfo
> &STI,
> - MCAsmParser &P);
> + MCAsmParser &P,
> + const
> MCInstrInfo &MII);
> typedef MCDisassembler *(*MCDisassemblerCtorTy)(const Target &T,
> const
> MCSubtargetInfo
> &STI);
> typedef MCInstPrinter *(*MCInstPrinterCtorTy)(const Target &T,
> @@ -386,10 +387,11 @@ namespace llvm {
> /// \param Parser The target independent parser implementation
> to use for
> /// parsing and lexing.
> MCTargetAsmParser *createMCAsmParser(MCSubtargetInfo &STI,
> - MCAsmParser &Parser) const
> {
> + MCAsmParser &Parser,
> + const MCInstrInfo &MII)
> const {
> if (!MCAsmParserCtorFn)
> return 0;
> - return MCAsmParserCtorFn(STI, Parser);
> + return MCAsmParserCtorFn(STI, Parser, MII);
> }
>
> /// createAsmPrinter - Create a target specific assembly printer
> pass. This
> @@ -1142,8 +1144,9 @@ namespace llvm {
> }
>
> private:
> - static MCTargetAsmParser *Allocator(MCSubtargetInfo &STI,
> MCAsmParser &P) {
> - return new MCAsmParserImpl(STI, P);
> + static MCTargetAsmParser *Allocator(MCSubtargetInfo &STI,
> MCAsmParser &P,
> + const MCInstrInfo &MII) {
> + return new MCAsmParserImpl(STI, P, MII);
> }
> };
>
>
> Modified: llvm/trunk/include/llvm/Target/Target.td
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/Target.td?rev=190598&r1=190597&r2=190598&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Target/Target.td (original)
> +++ llvm/trunk/include/llvm/Target/Target.td Thu Sep 12 05:28:05 2013
> @@ -1010,6 +1010,17 @@ class SubtargetFeature<string n, string
> list<SubtargetFeature> Implies = i;
> }
>
> +/// Specifies a Subtarget feature that this instruction is
> deprecated on.
> +class Deprecated<SubtargetFeature dep> {
> + SubtargetFeature DeprecatedFeatureMask = dep;
> +}
> +
> +/// A custom predicate used to determine if an instruction is
> +/// deprecated or not.
> +class ComplexDeprecationPredicate<string dep> {
> + string ComplexDeprecationPredicate = dep;
> +}
> +
> //===----------------------------------------------------------------------===//
> // Processor chip sets - These values represent each of the chip
> sets supported
> // by the scheduler. Each Processor definition requires
> corresponding
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp?rev=190598&r1=190597&r2=190598&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp Thu Sep 12
> 05:28:05 2013
> @@ -94,7 +94,7 @@ static unsigned getGVAlignmentLog2(const
>
> AsmPrinter::AsmPrinter(TargetMachine &tm, MCStreamer &Streamer)
> : MachineFunctionPass(ID),
> - TM(tm), MAI(tm.getMCAsmInfo()),
> + TM(tm), MAI(tm.getMCAsmInfo()), MII(tm.getInstrInfo()),
> OutContext(Streamer.getContext()),
> OutStreamer(Streamer),
> LastMI(0), LastFn(0), Counter(~0U), SetCounter(0) {
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp?rev=190598&r1=190597&r2=190598&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp
> (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp Thu Sep
> 12 05:28:05 2013
> @@ -123,7 +123,7 @@ void AsmPrinter::EmitInlineAsm(StringRef
> TM.getTargetCPU(),
> TM.getTargetFeatureString()));
> OwningPtr<MCTargetAsmParser>
> - TAP(TM.getTarget().createMCAsmParser(*STI, *Parser));
> + TAP(TM.getTarget().createMCAsmParser(*STI, *Parser, *MII));
> if (!TAP)
> report_fatal_error("Inline asm not supported by this streamer
> because"
> " we don't have an asm parser for this
> target\n");
>
> Modified:
> llvm/trunk/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp?rev=190598&r1=190597&r2=190598&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
> (original)
> +++ llvm/trunk/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp Thu
> Sep 12 05:28:05 2013
> @@ -54,8 +54,9 @@ public:
> #include "AArch64GenAsmMatcher.inc"
> };
>
> - AArch64AsmParser(MCSubtargetInfo &_STI, MCAsmParser &_Parser)
> - : MCTargetAsmParser(), STI(_STI), Parser(_Parser) {
> + AArch64AsmParser(MCSubtargetInfo &_STI, MCAsmParser &_Parser,
> + const MCInstrInfo &MII)
> + : MCTargetAsmParser(), STI(_STI), Parser(_Parser) {
> MCAsmParserExtension::Initialize(_Parser);
>
> // Initialize the set of available features.
>
> Modified: llvm/trunk/lib/Target/ARM/ARMInstrInfo.td
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrInfo.td?rev=190598&r1=190597&r2=190598&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/ARMInstrInfo.td (original)
> +++ llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Thu Sep 12 05:28:05
> 2013
> @@ -1840,7 +1840,7 @@ defm PLDW : APreLoad<0, 1, "pldw">, Requ
> defm PLI : APreLoad<1, 0, "pli">, Requires<[IsARM,HasV7]>;
>
> def SETEND : AXI<(outs), (ins setend_op:$end), MiscFrm, NoItinerary,
> - "setend\t$end", []>, Requires<[IsARM]> {
> + "setend\t$end", []>, Requires<[IsARM]>,
> Deprecated<HasV8Ops> {
> bits<1> end;
> let Inst{31-10} = 0b1111000100000001000000;
> let Inst{9} = end;
> @@ -4772,7 +4772,8 @@ def MCR : MovRCopro<"mcr", 0 /* from ARM
> (ins p_imm:$cop, imm0_7:$opc1, GPR:$Rt,
> c_imm:$CRn,
> c_imm:$CRm, imm0_7:$opc2),
> [(int_arm_mcr imm:$cop, imm:$opc1, GPR:$Rt,
> imm:$CRn,
> - imm:$CRm, imm:$opc2)]>;
> + imm:$CRm, imm:$opc2)]>,
> + ComplexDeprecationPredicate<"MCR">;
> def : ARMInstAlias<"mcr${p} $cop, $opc1, $Rt, $CRn, $CRm",
> (MCR p_imm:$cop, imm0_7:$opc1, GPR:$Rt,
> c_imm:$CRn,
> c_imm:$CRm, 0, pred:$p)>;
>
> Modified: llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp?rev=190598&r1=190597&r2=190598&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp Thu Sep 12
> 05:28:05 2013
> @@ -24,6 +24,7 @@
> #include "llvm/MC/MCExpr.h"
> #include "llvm/MC/MCInst.h"
> #include "llvm/MC/MCInstrDesc.h"
> +#include "llvm/MC/MCInstrInfo.h"
> #include "llvm/MC/MCParser/MCAsmLexer.h"
> #include "llvm/MC/MCParser/MCAsmParser.h"
> #include "llvm/MC/MCParser/MCParsedAsmOperand.h"
> @@ -47,6 +48,7 @@ enum VectorLaneTy { NoLanes, AllLanes, I
> class ARMAsmParser : public MCTargetAsmParser {
> MCSubtargetInfo &STI;
> MCAsmParser &Parser;
> + const MCInstrInfo &MII;
> const MCRegisterInfo *MRI;
>
> // Unwind directives state
> @@ -232,8 +234,6 @@ class ARMAsmParser : public MCTargetAsmP
> SmallVectorImpl<MCParsedAsmOperand*>
> &Operands);
> bool shouldOmitPredicateOperand(StringRef Mnemonic,
> SmallVectorImpl<MCParsedAsmOperand*>
> &Operands);
> - bool isDeprecated(MCInst &Inst, StringRef &Info);
> -
> public:
> enum ARMMatchResultTy {
> Match_RequiresITBlock = FIRST_TARGET_MATCH_RESULT_TY,
> @@ -245,8 +245,9 @@ public:
>
> };
>
> - ARMAsmParser(MCSubtargetInfo &_STI, MCAsmParser &_Parser)
> - : MCTargetAsmParser(), STI(_STI), Parser(_Parser), FPReg(-1) {
> + ARMAsmParser(MCSubtargetInfo &_STI, MCAsmParser &_Parser,
> + const MCInstrInfo &MII)
> + : MCTargetAsmParser(), STI(_STI), Parser(_Parser), MII(MII),
> FPReg(-1) {
> MCAsmParserExtension::Initialize(_Parser);
>
> // Cache the MCRegisterInfo.
> @@ -4972,14 +4973,6 @@ bool ARMAsmParser::shouldOmitPredicateOp
> return false;
> }
>
> -bool ARMAsmParser::isDeprecated(MCInst &Inst, StringRef &Info) {
> - if (hasV8Ops() && Inst.getOpcode() == ARM::SETEND) {
> - Info = "armv8";
> - return true;
> - }
> - return false;
> -}
> -
> static bool isDataTypeToken(StringRef Tok) {
> return Tok == ".8" || Tok == ".16" || Tok == ".32" || Tok == ".64"
> ||
> Tok == ".i8" || Tok == ".i16" || Tok == ".i32" || Tok == ".i64"
> ||
> @@ -5296,16 +5289,6 @@ static bool listContainsReg(MCInst &Inst
> return false;
> }
>
> -// FIXME: We would really prefer to have MCInstrInfo (the wrapper
> around
> -// the ARMInsts array) instead. Getting that here requires awkward
> -// API changes, though. Better way?
> -namespace llvm {
> -extern const MCInstrDesc ARMInsts[];
> -}
> -static const MCInstrDesc &getInstDesc(unsigned Opcode) {
> - return ARMInsts[Opcode];
> -}
> -
> // Return true if instruction has the interesting property of being
> // allowed in IT blocks, but not being predicable.
> static bool instIsBreakpoint(const MCInst &Inst) {
> @@ -5320,7 +5303,7 @@ static bool instIsBreakpoint(const MCIns
> bool ARMAsmParser::
> validateInstruction(MCInst &Inst,
> const SmallVectorImpl<MCParsedAsmOperand*>
> &Operands) {
> - const MCInstrDesc &MCID = getInstDesc(Inst.getOpcode());
> + const MCInstrDesc &MCID = MII.get(Inst.getOpcode());
> SMLoc Loc = Operands[0]->getStartLoc();
>
> // Check the IT block state first.
> @@ -5513,10 +5496,6 @@ validateInstruction(MCInst &Inst,
> }
> }
>
> - StringRef DepInfo;
> - if (isDeprecated(Inst, DepInfo))
> - Warning(Loc, "deprecated on " + DepInfo);
> -
> return false;
> }
>
> @@ -7553,7 +7532,7 @@ unsigned ARMAsmParser::checkTargetMatchP
> // 16-bit thumb arithmetic instructions either require or preclude
> the 'S'
> // suffix depending on whether they're in an IT block or not.
> unsigned Opc = Inst.getOpcode();
> - const MCInstrDesc &MCID = getInstDesc(Opc);
> + const MCInstrDesc &MCID = MII.get(Opc);
> if (MCID.TSFlags & ARMII::ThumbArithFlagSetting) {
> assert(MCID.hasOptionalDef() &&
> "optionally flag setting instruction missing optional def
> operand");
>
> Modified: llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp?rev=190598&r1=190597&r2=190598&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
> (original)
> +++ llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp Thu
> Sep 12 05:28:05 2013
> @@ -26,16 +26,32 @@
> #include "llvm/Support/ErrorHandling.h"
> #include "llvm/Support/TargetRegistry.h"
>
> +using namespace llvm;
> +
> #define GET_REGINFO_MC_DESC
> #include "ARMGenRegisterInfo.inc"
>
> +static bool getMCRDeprecationInfo(MCInst &MI, MCSubtargetInfo &STI,
> + std::string &Info) {
> + // Checks for the deprecated CP15ISB encoding:
> + // mcr pX, #0, rX, c7, c5, #4
> + if (STI.getFeatureBits() & llvm::ARM::HasV8Ops &&
> + (MI.getOperand(1).isImm() && MI.getOperand(1).getImm() == 0)
> &&
> + (MI.getOperand(3).isImm() && MI.getOperand(3).getImm() == 7)
> &&
> + (MI.getOperand(4).isImm() && MI.getOperand(4).getImm() == 5)
> &&
> + (MI.getOperand(5).isImm() && MI.getOperand(5).getImm() == 4))
> {
> + Info = "deprecated on armv8";
> + return true;
> + }
> + return false;
> +}
> +
> #define GET_INSTRINFO_MC_DESC
> #include "ARMGenInstrInfo.inc"
>
> #define GET_SUBTARGETINFO_MC_DESC
> #include "ARMGenSubtargetInfo.inc"
>
> -using namespace llvm;
>
> std::string ARM_MC::ParseARMTriple(StringRef TT, StringRef CPU) {
> Triple triple(TT);
>
> Modified: llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp?rev=190598&r1=190597&r2=190598&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp (original)
> +++ llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp Thu Sep 12
> 05:28:05 2013
> @@ -24,6 +24,10 @@
>
> using namespace llvm;
>
> +namespace llvm {
> +class MCInstrInfo;
> +}
> +
> namespace {
> class MipsAssemblerOptions {
> public:
> @@ -201,8 +205,10 @@ class MipsAsmParser : public MCTargetAsm
> bool processInstruction(MCInst &Inst, SMLoc IDLoc,
> SmallVectorImpl<MCInst> &Instructions);
> public:
> - MipsAsmParser(MCSubtargetInfo &sti, MCAsmParser &parser)
> - : MCTargetAsmParser(), STI(sti), Parser(parser),
> hasConsumedDollar(false) {
> + MipsAsmParser(MCSubtargetInfo &sti, MCAsmParser &parser,
> + const MCInstrInfo &MII)
> + : MCTargetAsmParser(), STI(sti), Parser(parser),
> + hasConsumedDollar(false) {
> // Initialize the set of available features.
> setAvailableFeatures(ComputeAvailableFeatures(STI.getFeatureBits()));
> }
>
> Modified: llvm/trunk/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp?rev=190598&r1=190597&r2=190598&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp
> (original)
> +++ llvm/trunk/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp Thu Sep
> 12 05:28:05 2013
> @@ -218,8 +218,9 @@ class PPCAsmParser : public MCTargetAsmP
>
>
> public:
> - PPCAsmParser(MCSubtargetInfo &_STI, MCAsmParser &_Parser)
> - : MCTargetAsmParser(), STI(_STI), Parser(_Parser) {
> + PPCAsmParser(MCSubtargetInfo &_STI, MCAsmParser &_Parser,
> + const MCInstrInfo &MII)
> + : MCTargetAsmParser(), STI(_STI), Parser(_Parser) {
> // Check for 64-bit vs. 32-bit pointer mode.
> Triple TheTriple(STI.getTargetTriple());
> IsPPC64 = (TheTriple.getArch() == Triple::ppc64 ||
>
> Modified:
> llvm/trunk/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp?rev=190598&r1=190597&r2=190598&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp
> (original)
> +++ llvm/trunk/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp Thu
> Sep 12 05:28:05 2013
> @@ -327,8 +327,9 @@ private:
> StringRef Mnemonic);
>
> public:
> - SystemZAsmParser(MCSubtargetInfo &sti, MCAsmParser &parser)
> - : MCTargetAsmParser(), STI(sti), Parser(parser) {
> + SystemZAsmParser(MCSubtargetInfo &sti, MCAsmParser &parser,
> + const MCInstrInfo &MII)
> + : MCTargetAsmParser(), STI(sti), Parser(parser) {
> MCAsmParserExtension::Initialize(Parser);
>
> // Initialize the set of available features.
>
> Modified: llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp?rev=190598&r1=190597&r2=190598&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp (original)
> +++ llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp Thu Sep 12
> 05:28:05 2013
> @@ -556,8 +556,9 @@ private:
> /// }
>
> public:
> - X86AsmParser(MCSubtargetInfo &sti, MCAsmParser &parser)
> - : MCTargetAsmParser(), STI(sti), Parser(parser), InstInfo(0) {
> + X86AsmParser(MCSubtargetInfo &sti, MCAsmParser &parser,
> + const MCInstrInfo &MII)
> + : MCTargetAsmParser(), STI(sti), Parser(parser), InstInfo(0) {
>
> // Initialize the set of available features.
> setAvailableFeatures(ComputeAvailableFeatures(STI.getFeatureBits()));
>
> Modified: llvm/trunk/test/MC/ARM/deprecated-v8.s
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/deprecated-v8.s?rev=190598&r1=190597&r2=190598&view=diff
> ==============================================================================
> --- llvm/trunk/test/MC/ARM/deprecated-v8.s (original)
> +++ llvm/trunk/test/MC/ARM/deprecated-v8.s Thu Sep 12 05:28:05 2013
> @@ -1,3 +1,5 @@
> @ RUN: llvm-mc -triple armv8 -show-encoding < %s 2>&1 | FileCheck %s
> setend be
> +@ CHECK: warning: deprecated
> +mcr p8, #0, r5, c7, c5, #4
> @ CHECK: warning: deprecated on armv8
>
> Modified: llvm/trunk/tools/llvm-mc/llvm-mc.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-mc/llvm-mc.cpp?rev=190598&r1=190597&r2=190598&view=diff
> ==============================================================================
> --- llvm/trunk/tools/llvm-mc/llvm-mc.cpp (original)
> +++ llvm/trunk/tools/llvm-mc/llvm-mc.cpp Thu Sep 12 05:28:05 2013
> @@ -319,10 +319,10 @@ static int AsLexInput(SourceMgr &SrcMgr,
>
> static int AssembleInput(const char *ProgName, const Target
> *TheTarget,
> SourceMgr &SrcMgr, MCContext &Ctx,
> MCStreamer &Str,
> - MCAsmInfo &MAI, MCSubtargetInfo &STI) {
> + MCAsmInfo &MAI, MCSubtargetInfo &STI,
> MCInstrInfo &MCII) {
> OwningPtr<MCAsmParser> Parser(createMCAsmParser(SrcMgr, Ctx,
> Str, MAI));
> - OwningPtr<MCTargetAsmParser> TAP(TheTarget->createMCAsmParser(STI,
> *Parser));
> + OwningPtr<MCTargetAsmParser> TAP(TheTarget->createMCAsmParser(STI,
> *Parser, MCII));
> if (!TAP) {
> errs() << ProgName
> << ": error: this target does not support assembly
> parsing.\n";
> @@ -459,7 +459,7 @@ int main(int argc, char **argv) {
> Res = AsLexInput(SrcMgr, *MAI, Out.get());
> break;
> case AC_Assemble:
> - Res = AssembleInput(ProgName, TheTarget, SrcMgr, Ctx, *Str,
> *MAI, *STI);
> + Res = AssembleInput(ProgName, TheTarget, SrcMgr, Ctx, *Str,
> *MAI, *STI, *MCII);
> break;
> case AC_MDisassemble:
> assert(IP && "Expected assembly output");
>
> Modified: llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp?rev=190598&r1=190597&r2=190598&view=diff
> ==============================================================================
> --- llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp (original)
> +++ llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp Thu Sep 12
> 05:28:05 2013
> @@ -430,6 +430,9 @@ struct MatchableInfo {
> /// function.
> std::string ConversionFnKind;
>
> + /// If this instruction is deprecated in some form.
> + bool HasDeprecation;
> +
> MatchableInfo(const CodeGenInstruction &CGI)
> : AsmVariantID(0), TheDef(CGI.TheDef), DefRec(&CGI),
> AsmString(CGI.AsmString) {
> @@ -779,6 +782,13 @@ void MatchableInfo::initialize(const Asm
> if (Record *Reg = AsmOperands[i].SingletonReg)
> SingletonRegisters.insert(Reg);
> }
> +
> + const RecordVal *DepMask =
> TheDef->getValue("DeprecatedFeatureMask");
> + if (!DepMask)
> + DepMask = TheDef->getValue("ComplexDeprecationPredicate");
> +
> + HasDeprecation =
> + DepMask ? !DepMask->getValue()->getAsUnquotedString().empty()
> : false;
> }
>
> /// tokenizeAsmString - Tokenize a simplified assembly string.
> @@ -2743,11 +2753,13 @@ void AsmMatcherEmitter::run(raw_ostream
>
> size_t MaxNumOperands = 0;
> unsigned MaxMnemonicIndex = 0;
> + bool HasDeprecation = false;
> for (std::vector<MatchableInfo*>::const_iterator it =
> Info.Matchables.begin(), ie = Info.Matchables.end();
> it != ie; ++it) {
> MatchableInfo &II = **it;
> MaxNumOperands = std::max(MaxNumOperands,
> II.AsmOperands.size());
> + HasDeprecation |= II.HasDeprecation;
>
> // Store a pascal-style length byte in the mnemonic.
> std::string LenMnemonic = char(II.Mnemonic.size()) +
> II.Mnemonic.str();
> @@ -3018,6 +3030,14 @@ void AsmMatcherEmitter::run(raw_ostream
> if (!InsnCleanupFn.empty())
> OS << " " << InsnCleanupFn << "(Inst);\n";
>
> + if (HasDeprecation) {
> + OS << " std::string Info;\n";
> + OS << " if (MII.get(Inst.getOpcode()).getDeprecatedInfo(Inst,
> STI, Info)) {\n";
> + OS << " SMLoc Loc = ((" << Target.getName() <<
> "Operand*)Operands[0])->getStartLoc();\n";
> + OS << " Parser.Warning(Loc, Info, None);\n";
> + OS << " }\n";
> + }
> +
> OS << " return Match_Success;\n";
> OS << " }\n\n";
>
>
> Modified: llvm/trunk/utils/TableGen/CodeGenInstruction.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenInstruction.cpp?rev=190598&r1=190597&r2=190598&view=diff
> ==============================================================================
> --- llvm/trunk/utils/TableGen/CodeGenInstruction.cpp (original)
> +++ llvm/trunk/utils/TableGen/CodeGenInstruction.cpp Thu Sep 12
> 05:28:05 2013
> @@ -337,6 +337,20 @@ CodeGenInstruction::CodeGenInstruction(R
>
> // Parse the DisableEncoding field.
> Operands.ProcessDisableEncoding(R->getValueAsString("DisableEncoding"));
> +
> + // First check for a ComplexDeprecationPredicate.
> + if (R->getValue("ComplexDeprecationPredicate")) {
> + HasComplexDeprecationPredicate = true;
> + DeprecatedReason =
> R->getValueAsString("ComplexDeprecationPredicate");
> + } else if (RecordVal *Dep = R->getValue("DeprecatedFeatureMask"))
> {
> + // Check if we have a Subtarget feature mask.
> + HasComplexDeprecationPredicate = false;
> + DeprecatedReason = Dep->getValue()->getAsString();
> + } else {
> + // This instruction isn't deprecated.
> + HasComplexDeprecationPredicate = false;
> + DeprecatedReason = "";
> + }
> }
>
> /// HasOneImplicitDefWithKnownVT - If the instruction has at least
> one
>
> Modified: llvm/trunk/utils/TableGen/CodeGenInstruction.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenInstruction.h?rev=190598&r1=190597&r2=190598&view=diff
> ==============================================================================
> --- llvm/trunk/utils/TableGen/CodeGenInstruction.h (original)
> +++ llvm/trunk/utils/TableGen/CodeGenInstruction.h Thu Sep 12
> 05:28:05 2013
> @@ -248,6 +248,9 @@ namespace llvm {
> bool isCodeGenOnly;
> bool isPseudo;
>
> + std::string DeprecatedReason;
> + bool HasComplexDeprecationPredicate;
> +
> /// Are there any undefined flags?
> bool hasUndefFlags() const {
> return mayLoad_Unset || mayStore_Unset ||
> hasSideEffects_Unset;
>
> Modified: llvm/trunk/utils/TableGen/InstrInfoEmitter.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/InstrInfoEmitter.cpp?rev=190598&r1=190597&r2=190598&view=diff
> ==============================================================================
> --- llvm/trunk/utils/TableGen/InstrInfoEmitter.cpp (original)
> +++ llvm/trunk/utils/TableGen/InstrInfoEmitter.cpp Thu Sep 12
> 05:28:05 2013
> @@ -514,6 +514,19 @@ void InstrInfoEmitter::emitRecord(const
> else
> OS << "OperandInfo" << OpInfo.find(OperandInfo)->second;
>
> + CodeGenTarget &Target = CDP.getTargetInfo();
> + if (Inst.HasComplexDeprecationPredicate)
> + // Emit a function pointer to the complex predicate method.
> + OS << ",0"
> + << ",&get" << Inst.DeprecatedReason << "DeprecationInfo";
> + else if (!Inst.DeprecatedReason.empty())
> + // Emit the Subtarget feature.
> + OS << "," << Target.getInstNamespace() << "::" <<
> Inst.DeprecatedReason
> + << ",0";
> + else
> + // Instruction isn't deprecated.
> + OS << ",0,0";
> +
> OS << " }, // Inst #" << Num << " = " << Inst.TheDef->getName()
> << "\n";
> }
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
--
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory
More information about the llvm-commits
mailing list