From 667381b21f75d6964bbdf6af143308a02b9198a8 Mon Sep 17 00:00:00 2001 From: Jim Grosbach Date: Wed, 9 May 2012 18:17:30 +0000 Subject: [PATCH] ARM: Support marking intrinsic definitions as 'unavailable' git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@156490 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/arm_neon.td | 1 + utils/TableGen/NeonEmitter.cpp | 12 ++++++++---- utils/TableGen/NeonEmitter.h | 2 ++ 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/include/clang/Basic/arm_neon.td b/include/clang/Basic/arm_neon.td index 71a0aa2726..451d562923 100644 --- a/include/clang/Basic/arm_neon.td +++ b/include/clang/Basic/arm_neon.td @@ -15,6 +15,7 @@ class Op; def OP_NONE : Op; +def OP_UNAVAILABLE : Op; def OP_ADD : Op; def OP_ADDL : Op; def OP_ADDW : Op; diff --git a/utils/TableGen/NeonEmitter.cpp b/utils/TableGen/NeonEmitter.cpp index e6f2e53aa7..658890cb1e 100644 --- a/utils/TableGen/NeonEmitter.cpp +++ b/utils/TableGen/NeonEmitter.cpp @@ -1012,7 +1012,7 @@ static std::string GenIntrinsic(const std::string &name, StringRef outTypeStr, StringRef inTypeStr, OpKind kind, ClassKind classKind) { assert(!proto.empty() && ""); - bool define = UseMacro(proto); + bool define = UseMacro(proto) && kind != OpUnavailable; std::string s; // static always inline + return type @@ -1040,9 +1040,11 @@ static std::string GenIntrinsic(const std::string &name, if (define) { s += " __extension__ ({ \\\n "; s += GenMacroLocals(proto, inTypeStr); - } else { + } else if (kind == OpUnavailable) { + s += " __attribute__((unavailable));\n"; + return s; + } else s += " { \\\n "; - } if (kind != OpNone) s += GenOpString(kind, proto, outTypeStr); @@ -1238,7 +1240,7 @@ static unsigned RangeFromType(const char mod, StringRef typestr) { /// runHeader - Emit a file with sections defining: /// 1. the NEON section of BuiltinsARM.def. /// 2. the SemaChecking code for the type overload checking. -/// 3. the SemaChecking code for validation of intrinsic immedate arguments. +/// 3. the SemaChecking code for validation of intrinsic immediate arguments. void NeonEmitter::runHeader(raw_ostream &OS) { std::vector RV = Records.getAllDerivedDefinitions("Inst"); @@ -1551,6 +1553,8 @@ void NeonEmitter::runTests(raw_ostream &OS) { ParseTypes(R, Types, TypeVec); OpKind kind = OpMap[R->getValueAsDef("Operand")->getName()]; + if (kind == OpUnavailable) + continue; for (unsigned ti = 0, te = TypeVec.size(); ti != te; ++ti) { if (kind == OpReinterpret) { bool outQuad = false; diff --git a/utils/TableGen/NeonEmitter.h b/utils/TableGen/NeonEmitter.h index dec7451111..7a703feb18 100644 --- a/utils/TableGen/NeonEmitter.h +++ b/utils/TableGen/NeonEmitter.h @@ -23,6 +23,7 @@ enum OpKind { OpNone, + OpUnavailable, OpAdd, OpAddl, OpAddw, @@ -130,6 +131,7 @@ namespace llvm { public: NeonEmitter(RecordKeeper &R) : Records(R) { OpMap["OP_NONE"] = OpNone; + OpMap["OP_UNAVAILABLE"] = OpUnavailable; OpMap["OP_ADD"] = OpAdd; OpMap["OP_ADDL"] = OpAddl; OpMap["OP_ADDW"] = OpAddw; -- 2.40.0