aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Basic/Builtins.cpp
diff options
context:
space:
mode:
authorErik Pilkington <erik.pilkington@gmail.com>2019-02-11 23:21:39 +0000
committerErik Pilkington <erik.pilkington@gmail.com>2019-02-11 23:21:39 +0000
commite3cd735ea6378e5dd7765828f560ed49be845a95 (patch)
tree91101427ae598d9ea6ced7a2e44f0f4f209fe4a9 /clang/lib/Basic/Builtins.cpp
parent796ac80b863ed92c3d8bcc296f678ff416afc8a8 (diff)
downloadllvm-e3cd735ea6378e5dd7765828f560ed49be845a95.zip
llvm-e3cd735ea6378e5dd7765828f560ed49be845a95.tar.gz
llvm-e3cd735ea6378e5dd7765828f560ed49be845a95.tar.bz2
Add a new attribute, fortify_stdlib
This attribute applies to declarations of C stdlib functions (sprintf, memcpy...) that have known fortified variants (__sprintf_chk, __memcpy_chk, ...). When applied, clang will emit calls to the fortified variant functions instead of calls to the defaults. In GCC, this is done by adding gnu_inline-style wrapper functions, but that doesn't work for us for variadic functions because we don't support __builtin_va_arg_pack (and have no intention to). This attribute takes two arguments, the first is 'type' argument passed through to __builtin_object_size, and the second is a flag argument that gets passed through to the variadic checking variants. rdar://47905754 Differential revision: https://reviews.llvm.org/D57918 llvm-svn: 353765
Diffstat (limited to 'clang/lib/Basic/Builtins.cpp')
-rw-r--r--clang/lib/Basic/Builtins.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/clang/lib/Basic/Builtins.cpp b/clang/lib/Basic/Builtins.cpp
index f04bc1f..4d4c2ff 100644
--- a/clang/lib/Basic/Builtins.cpp
+++ b/clang/lib/Basic/Builtins.cpp
@@ -188,3 +188,28 @@ bool Builtin::Context::canBeRedeclared(unsigned ID) const {
(!hasReferenceArgsOrResult(ID) &&
!hasCustomTypechecking(ID));
}
+
+unsigned Builtin::getFortifiedVariantFunction(unsigned BuiltinID) {
+ switch (BuiltinID) {
+ case Builtin::BImemcpy: return Builtin::BI__builtin___memcpy_chk;
+ case Builtin::BImemmove: return Builtin::BI__builtin___memmove_chk;
+ case Builtin::BImemset: return Builtin::BI__builtin___memset_chk;
+ case Builtin::BIstpcpy: return Builtin::BI__builtin___stpcpy_chk;
+ case Builtin::BIstrcat: return Builtin::BI__builtin___strcat_chk;
+ case Builtin::BIstrcpy: return Builtin::BI__builtin___strcpy_chk;
+ case Builtin::BIstrlcat: return Builtin::BI__builtin___strlcat_chk;
+ case Builtin::BIstrlcpy: return Builtin::BI__builtin___strlcpy_chk;
+ case Builtin::BIstrncat: return Builtin::BI__builtin___strncat_chk;
+ case Builtin::BIstrncpy: return Builtin::BI__builtin___strncpy_chk;
+ case Builtin::BIstpncpy: return Builtin::BI__builtin___stpncpy_chk;
+ case Builtin::BIsnprintf: return Builtin::BI__builtin___snprintf_chk;
+ case Builtin::BIvsnprintf: return Builtin::BI__builtin___vsnprintf_chk;
+ case Builtin::BIsprintf: return Builtin::BI__builtin___sprintf_chk;
+ case Builtin::BIvsprintf: return Builtin::BI__builtin___vsprintf_chk;
+ case Builtin::BIfprintf: return Builtin::BI__builtin___fprintf_chk;
+ case Builtin::BIvfprintf: return Builtin::BI__builtin___vfprintf_chk;
+ case Builtin::BIprintf: return Builtin::BI__builtin___printf_chk;
+ case Builtin::BIvprintf: return Builtin::BI__builtin___vprintf_chk;
+ default: return 0;
+ }
+}