diff options
author | Erik Pilkington <erik.pilkington@gmail.com> | 2019-02-11 23:21:39 +0000 |
---|---|---|
committer | Erik Pilkington <erik.pilkington@gmail.com> | 2019-02-11 23:21:39 +0000 |
commit | e3cd735ea6378e5dd7765828f560ed49be845a95 (patch) | |
tree | 91101427ae598d9ea6ced7a2e44f0f4f209fe4a9 /clang/lib/Basic/Builtins.cpp | |
parent | 796ac80b863ed92c3d8bcc296f678ff416afc8a8 (diff) | |
download | llvm-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.cpp | 25 |
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; + } +} |