Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752831AbbGaKWM (ORCPT ); Fri, 31 Jul 2015 06:22:12 -0400 Received: from szxga01-in.huawei.com ([58.251.152.64]:34272 "EHLO szxga01-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751149AbbGaKWI (ORCPT ); Fri, 31 Jul 2015 06:22:08 -0400 From: Wang Nan To: CC: , , Subject: [LLVM CLANG PATCH] BPF: add __builtin_bpf_typeid() Date: Fri, 31 Jul 2015 10:21:57 +0000 Message-ID: <1438338117-184506-1-git-send-email-wangnan0@huawei.com> X-Mailer: git-send-email 1.8.3.4 In-Reply-To: <55BB4B8A.5000207@huawei.com> References: <55BB4B8A.5000207@huawei.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.107.193.248] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5344 Lines: 146 This patch introduces a new builtin function __builtin_bpf_typeid() for BPF. This function emit a 'llvm.eh_typeid_for', and will be converted to typeid of a global variable. Signed-off-by: Wang Nan --- include/clang/Basic/BuiltinsBPF.def | 16 ++++++++++++++++ include/clang/Basic/TargetBuiltins.h | 9 +++++++++ lib/Basic/Targets.cpp | 14 +++++++++++++- lib/CodeGen/CGBuiltin.cpp | 16 ++++++++++++++++ lib/CodeGen/CodeGenFunction.h | 1 + 5 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 include/clang/Basic/BuiltinsBPF.def diff --git a/include/clang/Basic/BuiltinsBPF.def b/include/clang/Basic/BuiltinsBPF.def new file mode 100644 index 0000000..9e53ee0 --- /dev/null +++ b/include/clang/Basic/BuiltinsBPF.def @@ -0,0 +1,16 @@ +//===--- BuiltinsBPF.def - BPF Builtin function database ----*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file defines the BPF-specific builtin function database. Users of +// this file must define the BUILTIN macro to make use of this information. +// +//===----------------------------------------------------------------------===// + +BUILTIN(__builtin_bpf_typeid, "Wiv*", "nc") + diff --git a/include/clang/Basic/TargetBuiltins.h b/include/clang/Basic/TargetBuiltins.h index b4740c5..550f921 100644 --- a/include/clang/Basic/TargetBuiltins.h +++ b/include/clang/Basic/TargetBuiltins.h @@ -93,6 +93,15 @@ namespace clang { }; } + namespace BPF { + enum { + LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1, +#define BUILTIN(ID, TYPE, ATTRS) BI##ID, +#include "clang/Basic/BuiltinsBPF.def" + LastTSBuiltin + }; + } + /// \brief Flags to identify the types for overloaded Neon builtins. /// /// These must be kept in sync with the flags in utils/TableGen/NeonEmitter.h. diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index f229c99..aa7fffb 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -6111,6 +6111,7 @@ validateAsmConstraint(const char *&Name, }; class BPFTargetInfo : public TargetInfo { + static const Builtin::Info BuiltinInfo[]; public: BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) { LongWidth = LongAlign = PointerWidth = PointerAlign = 64; @@ -6141,7 +6142,10 @@ public: } void getTargetBuiltins(const Builtin::Info *&Records, - unsigned &NumRecords) const override {} + unsigned &NumRecords) const override { + Records = BuiltinInfo; + NumRecords = clang::BPF::LastTSBuiltin - Builtin::FirstTSBuiltin; + } const char *getClobbers() const override { return ""; } @@ -6164,6 +6168,14 @@ public: } }; +const Builtin::Info BPFTargetInfo::BuiltinInfo[] = { +#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES }, +#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\ + ALL_LANGUAGES }, +#include "clang/Basic/BuiltinsBPF.def" +}; + + class MipsTargetInfoBase : public TargetInfo { virtual void setDescriptionString() = 0; diff --git a/lib/CodeGen/CGBuiltin.cpp b/lib/CodeGen/CGBuiltin.cpp index 1555d29..a46f638 100644 --- a/lib/CodeGen/CGBuiltin.cpp +++ b/lib/CodeGen/CGBuiltin.cpp @@ -1882,6 +1882,9 @@ Value *CodeGenFunction::EmitTargetBuiltinExpr(unsigned BuiltinID, case llvm::Triple::nvptx: case llvm::Triple::nvptx64: return EmitNVPTXBuiltinExpr(BuiltinID, E); + case llvm::Triple::bpfel: + case llvm::Triple::bpfeb: + return EmitBPFBuiltinExpr(BuiltinID, E); default: return nullptr; } @@ -7056,3 +7059,16 @@ Value *CodeGenFunction::EmitNVPTXBuiltinExpr(unsigned BuiltinID, return nullptr; } } + +Value *CodeGenFunction::EmitBPFBuiltinExpr(unsigned BuiltinID, + const CallExpr *E) { + switch (BuiltinID) { + default: + return nullptr; + case BPF::BI__builtin_bpf_typeid: + assert(E->getArg(0)->getType()->isPointerType()); + llvm::Value *llvm_eh_typeid_for = + CGM.getIntrinsic(llvm::Intrinsic::eh_typeid_for); + return Builder.CreateCall(llvm_eh_typeid_for, EmitScalarExpr(E->getArg(0))); + } +} diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h index b7d6bbd..863420d 100644 --- a/lib/CodeGen/CodeGenFunction.h +++ b/lib/CodeGen/CodeGenFunction.h @@ -2622,6 +2622,7 @@ public: llvm::Value *EmitAMDGPUBuiltinExpr(unsigned BuiltinID, const CallExpr *E); llvm::Value *EmitSystemZBuiltinExpr(unsigned BuiltinID, const CallExpr *E); llvm::Value *EmitNVPTXBuiltinExpr(unsigned BuiltinID, const CallExpr *E); + llvm::Value *EmitBPFBuiltinExpr(unsigned BuiltinID, const CallExpr *E); llvm::Value *EmitObjCProtocolExpr(const ObjCProtocolExpr *E); llvm::Value *EmitObjCStringLiteral(const ObjCStringLiteral *E); -- 1.8.3.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/