[llvm] r190598 - Add an instruction deprecation feature to TableGen.
Zonr Chang
zonr.xchg at gmail.com
Thu Sep 12 05:32:13 PDT 2013
Attachment contains the patch I used to fix the build break in
tools/lto/LTOModule.cpp. Please review and commit if ok.
Zonr
On Thu, Sep 12, 2013 at 6:41 PM, Joey Gouly <Joey.Gouly at arm.com> wrote:
> Hi Timur,
>
> Sorry, just about to commit the clang side of the patch.
>
> Thanks,
> Joey
>
> ________________________________________
> From: Timur Iskhodzhanov [timurrrr at google.com]
> Sent: 12 September 2013 11:40
> To: Joey Gouly
> Cc: llvm-commits
> Subject: Re: [llvm] r190598 - Add an instruction deprecation feature to
> TableGen.
>
> This seems to break build on Windows
>
> llvm\tools\clang\lib\Parse\ParseStmt.cpp(2110) : error C2660:
> 'llvm::Target::createMCAsmParser' : function does not take 2 arguments
>
> Can you please take a look?
>
>
> 2013/9/12 Joey Gouly <joey.gouly at arm.com<mailto:joey.gouly at arm.com>>
> 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.
>
> 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<mailto:llvm-commits at cs.uiuc.edu>
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
> -- IMPORTANT NOTICE: The contents of this email and any attachments are
> confidential and may also be privileged. If you are not the intended
> recipient, please notify the sender immediately and do not disclose the
> contents to any other person, use it for any purpose, or store or copy the
> information in any medium. Thank you.
>
> ARM Limited, Registered office 110 Fulbourn Road, Cambridge CB1 9NJ,
> Registered in England & Wales, Company No: 2557590
> ARM Holdings plc, Registered office 110 Fulbourn Road, Cambridge CB1 9NJ,
> Registered in England & Wales, Company No: 2548782
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130912/c645ec22/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: fix-build-break.patch
Type: application/octet-stream
Size: 1226 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130912/c645ec22/attachment.obj>
More information about the llvm-commits
mailing list