[PATCH] D67734: [CLANG-BPF] change __builtin_preserve_access_index() signature
Yonghong Song via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Sep 18 14:15:18 PDT 2019
yonghong-song created this revision.
yonghong-song added a reviewer: ast.
Herald added subscribers: cfe-commits, arphaman.
Herald added a project: clang.
The clang intrinsic __builtin_preserve_access_index() currently
has signature:
const void * __builtin_preserve_access_index(const void * ptr)
This may cause compiler warning when:
- parameter type is "volatile void *" or "const volatile void *", or
- the assign-to type of the intrinsic does not have "const" qualifier.
These warnings can be suppressed by type casting in the user code.
But let's design the __builtin_preserve_access_index() to be more
user friendly to avoid user casting.
The new signature looks like:
void * __builtin_preserve_access_index(const volatile void * ptr)
A type casting is generated to "void *" at the end of builtin
codegen. This type casting is typically combined with other subsequent
user casts or optimized away completely and has little impact on
optimized IR.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D67734
Files:
clang/docs/LanguageExtensions.rst
clang/include/clang/Basic/Builtins.def
clang/lib/CodeGen/CGBuiltin.cpp
clang/lib/Sema/SemaChecking.cpp
clang/test/Sema/builtin-preserve-access-index.c
Index: clang/test/Sema/builtin-preserve-access-index.c
===================================================================
--- clang/test/Sema/builtin-preserve-access-index.c
+++ clang/test/Sema/builtin-preserve-access-index.c
@@ -4,10 +4,10 @@
return __builtin_preserve_access_index(&arg[1], 1); // expected-error {{too many arguments to function call, expected 1, have 2}}
}
-void *invalid2(const int *arg) {
- return __builtin_preserve_access_index(&arg[1]); // expected-warning {{returning 'const void *' from a function with result type 'void *' discards qualifiers}}
+void *valid2(const int *arg) {
+ return __builtin_preserve_access_index(&arg[1]);
}
const void *invalid3(const int *arg) {
- return __builtin_preserve_access_index(1); // expected-warning {{incompatible integer to pointer conversion passing 'int' to parameter of type 'const void *'}}
+ return __builtin_preserve_access_index(1); // expected-warning {{incompatible integer to pointer conversion passing 'int' to parameter of type 'const volatile void *'}}
}
Index: clang/lib/Sema/SemaChecking.cpp
===================================================================
--- clang/lib/Sema/SemaChecking.cpp
+++ clang/lib/Sema/SemaChecking.cpp
@@ -197,7 +197,6 @@
if (checkArgCount(S, TheCall, 1))
return true;
- TheCall->setType(TheCall->getArg(0)->getType());
return false;
}
Index: clang/lib/CodeGen/CGBuiltin.cpp
===================================================================
--- clang/lib/CodeGen/CGBuiltin.cpp
+++ clang/lib/CodeGen/CGBuiltin.cpp
@@ -1879,6 +1879,8 @@
IsInPreservedAIRegion = true;
Value *Res = EmitScalarExpr(E->getArg(0));
+ unsigned AddrSpace = Res->getType()->getPointerAddressSpace();
+ Res = Builder.CreateBitCast(Res, Int8Ty->getPointerTo(AddrSpace));
IsInPreservedAIRegion = false;
return RValue::get(Res);
}
Index: clang/include/clang/Basic/Builtins.def
===================================================================
--- clang/include/clang/Basic/Builtins.def
+++ clang/include/clang/Basic/Builtins.def
@@ -1470,7 +1470,7 @@
BUILTIN(__builtin_operator_delete, "vv*", "tn")
BUILTIN(__builtin_char_memchr, "c*cC*iz", "n")
BUILTIN(__builtin_dump_struct, "ivC*v*", "tn")
-BUILTIN(__builtin_preserve_access_index, "vC*vC*", "nU")
+BUILTIN(__builtin_preserve_access_index, "v*vCD*", "nU")
// Safestack builtins
BUILTIN(__builtin___get_unsafe_stack_start, "v*", "Fn")
Index: clang/docs/LanguageExtensions.rst
===================================================================
--- clang/docs/LanguageExtensions.rst
+++ clang/docs/LanguageExtensions.rst
@@ -2358,7 +2358,7 @@
.. code-block:: c
- const void * __builtin_preserve_access_index(const void * ptr)
+ void * __builtin_preserve_access_index(const volatile void * ptr)
**Example of Use**:
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D67734.220750.patch
Type: text/x-patch
Size: 2829 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190918/8d74ac88/attachment.bin>
More information about the cfe-commits
mailing list