Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(146)

Unified Diff: lib/Analysis/NaCl/PNaClAllowedIntrinsics.cpp

Issue 1151093004: Changes from 3.7 merge to files not in upstream (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-llvm.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: lib/Analysis/NaCl/PNaClAllowedIntrinsics.cpp
diff --git a/lib/Analysis/NaCl/PNaClAllowedIntrinsics.cpp b/lib/Analysis/NaCl/PNaClAllowedIntrinsics.cpp
index 15fc677244158b1f36be62e23535a0fafed019d8..e895269f8ba0293f54a78ad525b2799a5a0c2aea 100644
--- a/lib/Analysis/NaCl/PNaClAllowedIntrinsics.cpp
+++ b/lib/Analysis/NaCl/PNaClAllowedIntrinsics.cpp
@@ -25,6 +25,72 @@
using namespace llvm;
+/*
+ The constructor sets up the whitelist of allowed intrinsics and their expected
+ types. The comments in that code have some details on the allowed intrinsics.
+ Additionally, the following intrinsics are disallowed for the stated reasons:
+
+ * Trampolines depend on a target-specific-sized/aligned buffer.
+ Intrinsic::adjust_trampoline:
+ Intrinsic::init_trampoline:
+ * CXX exception handling is not stable.
+ Intrinsic::eh_dwarf_cfa:
+ Intrinsic::eh_return_i32:
+ Intrinsic::eh_return_i64:
+ Intrinsic::eh_sjlj_callsite:
+ Intrinsic::eh_sjlj_functioncontext:
+ Intrinsic::eh_sjlj_longjmp:
+ Intrinsic::eh_sjlj_lsda:
+ Intrinsic::eh_sjlj_setjmp:
+ Intrinsic::eh_typeid_for:
+ Intrinsic::eh_unwind_init:
+ * We do not want to expose addresses to the user.
+ Intrinsic::frameaddress:
+ Intrinsic::returnaddress:
+ * We do not support stack protectors.
+ Intrinsic::stackprotector:
+ * Var-args handling is done w/out intrinsics.
+ Intrinsic::vacopy:
+ Intrinsic::vaend:
+ Intrinsic::vastart:
+ * Disallow the *_with_overflow intrinsics because they return
+ struct types. All of them can be introduced by passing -ftrapv
+ to Clang, which we do not support for now. umul_with_overflow
+ and uadd_with_overflow are introduced by Clang for C++'s new[],
+ but ExpandArithWithOverflow expands out this use.
+ Intrinsic::sadd_with_overflow:
+ Intrinsic::ssub_with_overflow:
+ Intrinsic::uadd_with_overflow:
+ Intrinsic::usub_with_overflow:
+ Intrinsic::smul_with_overflow:
+ Intrinsic::umul_with_overflow:
+ * Disallow lifetime.start/end because the semantics of what
+ arguments they accept are not very well defined, and because it
+ would be better to do merging of stack slots in the user
+ toolchain than in the PNaCl translator.
+ See https://code.google.com/p/nativeclient/issues/detail?id=3443
+ Intrinsic::lifetime_end:
+ Intrinsic::lifetime_start:
+ Intrinsic::invariant_end:
+ Intrinsic::invariant_start:
+ * Some transcendental functions not needed yet.
+ Intrinsic::cos:
+ Intrinsic::exp:
+ Intrinsic::exp2:
+ Intrinsic::log:
+ Intrinsic::log2:
+ Intrinsic::log10:
+ Intrinsic::pow:
+ Intrinsic::powi:
+ Intrinsic::sin:
+ * We run -lower-expect to convert Intrinsic::expect into branch weights
+ and consume in the middle-end. The backend just ignores llvm.expect.
+ Intrinsic::expect:
+ * For FLT_ROUNDS macro from float.h. It works for ARM and X86
+ (but not MIPS). Also, wait until we add a set_flt_rounds intrinsic
+ before we bless this.
+ case Intrinsic::flt_rounds:
+*/
PNaClAllowedIntrinsics::
PNaClAllowedIntrinsics(LLVMContext *Context) : Context(Context) {
Type *I8Ptr = Type::getInt8PtrTy(*Context);
@@ -110,88 +176,14 @@ bool PNaClAllowedIntrinsics::isAllowed(const Function *Func) {
return Func->getFunctionType() == TypeMap[Func->getName()];
// Check to see if debugging intrinsic, which can be allowed if
// command-line flag set.
- return isAllowedIntrinsicID(Func->getIntrinsicID());
+ return isAllowedDebugInfoIntrinsic(Func->getIntrinsicID());
}
-bool PNaClAllowedIntrinsics::isAllowedIntrinsicID(unsigned ID) {
- // (1) Allowed always, provided the exact name and type match.
- // (2) Never allowed.
- // (3) Debug info intrinsics.
- //
- // Please keep these sorted or grouped in a sensible way, within
- // each category.
- switch (ID) {
- // Disallow by default.
+bool PNaClAllowedIntrinsics::isAllowedDebugInfoIntrinsic(unsigned IntrinsicID) {
+ /* These intrinsics are allowed when debug info metadata is also allowed,
+ and we just assume that they are called correctly by the frontend. */
+ switch (IntrinsicID) {
default: return false;
-
- /* The following is intentionally commented out, since the default
- will return false.
- // (2) Known to be never allowed.
- case Intrinsic::not_intrinsic:
- // Trampolines depend on a target-specific-sized/aligned buffer.
- case Intrinsic::adjust_trampoline:
- case Intrinsic::init_trampoline:
- // CXX exception handling is not stable.
- case Intrinsic::eh_dwarf_cfa:
- case Intrinsic::eh_return_i32:
- case Intrinsic::eh_return_i64:
- case Intrinsic::eh_sjlj_callsite:
- case Intrinsic::eh_sjlj_functioncontext:
- case Intrinsic::eh_sjlj_longjmp:
- case Intrinsic::eh_sjlj_lsda:
- case Intrinsic::eh_sjlj_setjmp:
- case Intrinsic::eh_typeid_for:
- case Intrinsic::eh_unwind_init:
- // We do not want to expose addresses to the user.
- case Intrinsic::frameaddress:
- case Intrinsic::returnaddress:
- // Not supporting stack protectors.
- case Intrinsic::stackprotector:
- // Var-args handling is done w/out intrinsics.
- case Intrinsic::vacopy:
- case Intrinsic::vaend:
- case Intrinsic::vastart:
- // Disallow the *_with_overflow intrinsics because they return
- // struct types. All of them can be introduced by passing -ftrapv
- // to Clang, which we do not support for now. umul_with_overflow
- // and uadd_with_overflow are introduced by Clang for C++'s new[],
- // but ExpandArithWithOverflow expands out this use.
- case Intrinsic::sadd_with_overflow:
- case Intrinsic::ssub_with_overflow:
- case Intrinsic::uadd_with_overflow:
- case Intrinsic::usub_with_overflow:
- case Intrinsic::smul_with_overflow:
- case Intrinsic::umul_with_overflow:
- // Disallow lifetime.start/end because the semantics of what
- // arguments they accept are not very well defined, and because it
- // would be better to do merging of stack slots in the user
- // toolchain than in the PNaCl translator.
- // See https://code.google.com/p/nativeclient/issues/detail?id=3443
- case Intrinsic::lifetime_end:
- case Intrinsic::lifetime_start:
- case Intrinsic::invariant_end:
- case Intrinsic::invariant_start:
- // Some transcendental functions not needed yet.
- case Intrinsic::cos:
- case Intrinsic::exp:
- case Intrinsic::exp2:
- case Intrinsic::log:
- case Intrinsic::log2:
- case Intrinsic::log10:
- case Intrinsic::pow:
- case Intrinsic::powi:
- case Intrinsic::sin:
- // We run -lower-expect to convert Intrinsic::expect into branch weights
- // and consume in the middle-end. The backend just ignores llvm.expect.
- case Intrinsic::expect:
- // For FLT_ROUNDS macro from float.h. It works for ARM and X86
- // (but not MIPS). Also, wait until we add a set_flt_rounds intrinsic
- // before we bless this.
- case Intrinsic::flt_rounds:
- return false;
- */
-
- // (3) Debug info intrinsics.
case Intrinsic::dbg_declare:
case Intrinsic::dbg_value:
return PNaClABIAllowDebugMetadata;

Powered by Google App Engine
This is Rietveld 408576698