summaryrefslogtreecommitdiffstats
path: root/contrib/llvm/patches/patch-01-freebsd-kprintf.diff
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm/patches/patch-01-freebsd-kprintf.diff')
-rw-r--r--contrib/llvm/patches/patch-01-freebsd-kprintf.diff381
1 files changed, 0 insertions, 381 deletions
diff --git a/contrib/llvm/patches/patch-01-freebsd-kprintf.diff b/contrib/llvm/patches/patch-01-freebsd-kprintf.diff
deleted file mode 100644
index 252b4cd..0000000
--- a/contrib/llvm/patches/patch-01-freebsd-kprintf.diff
+++ /dev/null
@@ -1,381 +0,0 @@
-This patch adds support for the FreeBSD kernel specific printf format
-specifiers: %b, %D, %r and %y, via a new __freebsd_kprintf__ format
-string type.
-
-Sent upstream as http://reviews.llvm.org/D7154
-
-Index: tools/clang/include/clang/Analysis/Analyses/FormatString.h
-===================================================================
---- tools/clang/include/clang/Analysis/Analyses/FormatString.h
-+++ tools/clang/include/clang/Analysis/Analyses/FormatString.h
-@@ -161,6 +161,12 @@ class ConversionSpecifier {
- ObjCObjArg, // '@'
- ObjCBeg = ObjCObjArg, ObjCEnd = ObjCObjArg,
-
-+ // FreeBSD kernel specific specifiers.
-+ FreeBSDbArg,
-+ FreeBSDDArg,
-+ FreeBSDrArg,
-+ FreeBSDyArg,
-+
- // GlibC specific specifiers.
- PrintErrno, // 'm'
-
-@@ -204,7 +210,8 @@ class ConversionSpecifier {
- return EndScanList ? EndScanList - Position : 1;
- }
-
-- bool isIntArg() const { return kind >= IntArgBeg && kind <= IntArgEnd; }
-+ bool isIntArg() const { return (kind >= IntArgBeg && kind <= IntArgEnd) ||
-+ kind == FreeBSDrArg || kind == FreeBSDyArg; }
- bool isUIntArg() const { return kind >= UIntArgBeg && kind <= UIntArgEnd; }
- bool isAnyIntArg() const { return kind >= IntArgBeg && kind <= UIntArgEnd; }
- const char *toString() const;
-@@ -646,7 +653,7 @@ class FormatStringHandler {
-
- bool ParsePrintfString(FormatStringHandler &H,
- const char *beg, const char *end, const LangOptions &LO,
-- const TargetInfo &Target);
-+ const TargetInfo &Target, bool isFreeBSDKPrintf);
-
- bool ParseFormatStringHasSArg(const char *beg, const char *end, const LangOptions &LO,
- const TargetInfo &Target);
-Index: tools/clang/include/clang/Sema/Sema.h
-===================================================================
---- tools/clang/include/clang/Sema/Sema.h
-+++ tools/clang/include/clang/Sema/Sema.h
-@@ -8567,6 +8567,7 @@ class Sema {
- FST_Strftime,
- FST_Strfmon,
- FST_Kprintf,
-+ FST_FreeBSDKPrintf,
- FST_Unknown
- };
- static FormatStringType GetFormatStringType(const FormatAttr *Format);
-Index: tools/clang/lib/Analysis/FormatString.cpp
-===================================================================
---- tools/clang/lib/Analysis/FormatString.cpp
-+++ tools/clang/lib/Analysis/FormatString.cpp
-@@ -552,6 +552,12 @@ const char *ConversionSpecifier::toString() const
- // Objective-C specific specifiers.
- case ObjCObjArg: return "@";
-
-+ // FreeBSD kernel specific specifiers.
-+ case FreeBSDbArg: return "b";
-+ case FreeBSDDArg: return "D";
-+ case FreeBSDrArg: return "r";
-+ case FreeBSDyArg: return "y";
-+
- // GlibC specific specifiers.
- case PrintErrno: return "m";
-
-@@ -647,6 +653,9 @@ bool FormatSpecifier::hasValidLengthModifier(const
- case ConversionSpecifier::XArg:
- case ConversionSpecifier::nArg:
- return true;
-+ case ConversionSpecifier::FreeBSDrArg:
-+ case ConversionSpecifier::FreeBSDyArg:
-+ return Target.getTriple().isOSFreeBSD();
- default:
- return false;
- }
-@@ -677,6 +686,9 @@ bool FormatSpecifier::hasValidLengthModifier(const
- case ConversionSpecifier::ScanListArg:
- case ConversionSpecifier::ZArg:
- return true;
-+ case ConversionSpecifier::FreeBSDrArg:
-+ case ConversionSpecifier::FreeBSDyArg:
-+ return Target.getTriple().isOSFreeBSD();
- default:
- return false;
- }
-@@ -807,6 +819,10 @@ bool FormatSpecifier::hasStandardConversionSpecifi
- case ConversionSpecifier::SArg:
- return LangOpt.ObjC1 || LangOpt.ObjC2;
- case ConversionSpecifier::InvalidSpecifier:
-+ case ConversionSpecifier::FreeBSDbArg:
-+ case ConversionSpecifier::FreeBSDDArg:
-+ case ConversionSpecifier::FreeBSDrArg:
-+ case ConversionSpecifier::FreeBSDyArg:
- case ConversionSpecifier::PrintErrno:
- case ConversionSpecifier::DArg:
- case ConversionSpecifier::OArg:
-Index: tools/clang/lib/Analysis/PrintfFormatString.cpp
-===================================================================
---- tools/clang/lib/Analysis/PrintfFormatString.cpp
-+++ tools/clang/lib/Analysis/PrintfFormatString.cpp
-@@ -55,7 +55,8 @@ static PrintfSpecifierResult ParsePrintfSpecifier(
- unsigned &argIndex,
- const LangOptions &LO,
- const TargetInfo &Target,
-- bool Warn) {
-+ bool Warn,
-+ bool isFreeBSDKPrintf) {
-
- using namespace clang::analyze_format_string;
- using namespace clang::analyze_printf;
-@@ -206,9 +207,24 @@ static PrintfSpecifierResult ParsePrintfSpecifier(
- case '@': k = ConversionSpecifier::ObjCObjArg; break;
- // Glibc specific.
- case 'm': k = ConversionSpecifier::PrintErrno; break;
-+ // FreeBSD kernel specific.
-+ case 'b':
-+ if (isFreeBSDKPrintf)
-+ k = ConversionSpecifier::FreeBSDbArg; // int followed by char *
-+ break;
-+ case 'r':
-+ if (isFreeBSDKPrintf)
-+ k = ConversionSpecifier::FreeBSDrArg; // int
-+ break;
-+ case 'y':
-+ if (isFreeBSDKPrintf)
-+ k = ConversionSpecifier::FreeBSDyArg; // int
-+ break;
- // Apple-specific.
- case 'D':
-- if (Target.getTriple().isOSDarwin())
-+ if (isFreeBSDKPrintf)
-+ k = ConversionSpecifier::FreeBSDDArg; // void * followed by char *
-+ else if (Target.getTriple().isOSDarwin())
- k = ConversionSpecifier::DArg;
- break;
- case 'O':
-@@ -228,6 +244,10 @@ static PrintfSpecifierResult ParsePrintfSpecifier(
- FS.setConversionSpecifier(CS);
- if (CS.consumesDataArgument() && !FS.usesPositionalArg())
- FS.setArgIndex(argIndex++);
-+ // FreeBSD kernel specific.
-+ if (k == ConversionSpecifier::FreeBSDbArg ||
-+ k == ConversionSpecifier::FreeBSDDArg)
-+ argIndex++;
-
- if (k == ConversionSpecifier::InvalidSpecifier) {
- // Assume the conversion takes one argument.
-@@ -240,7 +260,8 @@ bool clang::analyze_format_string::ParsePrintfStri
- const char *I,
- const char *E,
- const LangOptions &LO,
-- const TargetInfo &Target) {
-+ const TargetInfo &Target,
-+ bool isFreeBSDKPrintf) {
-
- unsigned argIndex = 0;
-
-@@ -247,7 +268,8 @@ bool clang::analyze_format_string::ParsePrintfStri
- // Keep looking for a format specifier until we have exhausted the string.
- while (I != E) {
- const PrintfSpecifierResult &FSR = ParsePrintfSpecifier(H, I, E, argIndex,
-- LO, Target, true);
-+ LO, Target, true,
-+ isFreeBSDKPrintf);
- // Did a fail-stop error of any kind occur when parsing the specifier?
- // If so, don't do any more processing.
- if (FSR.shouldStop())
-@@ -276,7 +298,8 @@ bool clang::analyze_format_string::ParseFormatStri
- FormatStringHandler H;
- while (I != E) {
- const PrintfSpecifierResult &FSR = ParsePrintfSpecifier(H, I, E, argIndex,
-- LO, Target, false);
-+ LO, Target, false,
-+ false);
- // Did a fail-stop error of any kind occur when parsing the specifier?
- // If so, don't do any more processing.
- if (FSR.shouldStop())
-@@ -674,6 +697,8 @@ bool PrintfSpecifier::hasValidPlusPrefix() const {
- case ConversionSpecifier::GArg:
- case ConversionSpecifier::aArg:
- case ConversionSpecifier::AArg:
-+ case ConversionSpecifier::FreeBSDrArg:
-+ case ConversionSpecifier::FreeBSDyArg:
- return true;
-
- default:
-@@ -699,6 +724,8 @@ bool PrintfSpecifier::hasValidAlternativeForm() co
- case ConversionSpecifier::FArg:
- case ConversionSpecifier::gArg:
- case ConversionSpecifier::GArg:
-+ case ConversionSpecifier::FreeBSDrArg:
-+ case ConversionSpecifier::FreeBSDyArg:
- return true;
-
- default:
-@@ -729,6 +756,8 @@ bool PrintfSpecifier::hasValidLeadingZeros() const
- case ConversionSpecifier::FArg:
- case ConversionSpecifier::gArg:
- case ConversionSpecifier::GArg:
-+ case ConversionSpecifier::FreeBSDrArg:
-+ case ConversionSpecifier::FreeBSDyArg:
- return true;
-
- default:
-@@ -753,6 +782,8 @@ bool PrintfSpecifier::hasValidSpacePrefix() const
- case ConversionSpecifier::GArg:
- case ConversionSpecifier::aArg:
- case ConversionSpecifier::AArg:
-+ case ConversionSpecifier::FreeBSDrArg:
-+ case ConversionSpecifier::FreeBSDyArg:
- return true;
-
- default:
-@@ -818,6 +849,8 @@ bool PrintfSpecifier::hasValidPrecision() const {
- case ConversionSpecifier::gArg:
- case ConversionSpecifier::GArg:
- case ConversionSpecifier::sArg:
-+ case ConversionSpecifier::FreeBSDrArg:
-+ case ConversionSpecifier::FreeBSDyArg:
- return true;
-
- default:
-Index: tools/clang/lib/Sema/SemaChecking.cpp
-===================================================================
---- tools/clang/lib/Sema/SemaChecking.cpp
-+++ tools/clang/lib/Sema/SemaChecking.cpp
-@@ -2603,6 +2603,7 @@ Sema::FormatStringType Sema::GetFormatStringType(c
- .Case("strftime", FST_Strftime)
- .Case("strfmon", FST_Strfmon)
- .Cases("kprintf", "cmn_err", "vcmn_err", "zcmn_err", FST_Kprintf)
-+ .Case("freebsd_kprintf", FST_FreeBSDKPrintf)
- .Default(FST_Unknown);
- }
-
-@@ -3384,6 +3385,43 @@ CheckPrintfHandler::HandlePrintfSpecifier(const an
- CoveredArgs.set(argIndex);
- }
-
-+ // FreeBSD kernel extensions.
-+ if (CS.getKind() == ConversionSpecifier::FreeBSDbArg ||
-+ CS.getKind() == ConversionSpecifier::FreeBSDDArg) {
-+ // We need at least two arguments.
-+ if (!CheckNumArgs(FS, CS, startSpecifier, specifierLen, argIndex + 1))
-+ return false;
-+
-+ // Claim the second argument.
-+ CoveredArgs.set(argIndex + 1);
-+
-+ // Type check the first argument (int for %b, pointer for %D)
-+ const Expr *Ex = getDataArg(argIndex);
-+ const analyze_printf::ArgType &AT =
-+ (CS.getKind() == ConversionSpecifier::FreeBSDbArg) ?
-+ ArgType(S.Context.IntTy) : ArgType::CPointerTy;
-+ if (AT.isValid() && !AT.matchesType(S.Context, Ex->getType()))
-+ EmitFormatDiagnostic(
-+ S.PDiag(diag::warn_format_conversion_argument_type_mismatch)
-+ << AT.getRepresentativeTypeName(S.Context) << Ex->getType()
-+ << false << Ex->getSourceRange(),
-+ Ex->getLocStart(), /*IsStringLocation*/false,
-+ getSpecifierRange(startSpecifier, specifierLen));
-+
-+ // Type check the second argument (char * for both %b and %D)
-+ Ex = getDataArg(argIndex + 1);
-+ const analyze_printf::ArgType &AT2 = ArgType::CStrTy;
-+ if (AT2.isValid() && !AT2.matchesType(S.Context, Ex->getType()))
-+ EmitFormatDiagnostic(
-+ S.PDiag(diag::warn_format_conversion_argument_type_mismatch)
-+ << AT2.getRepresentativeTypeName(S.Context) << Ex->getType()
-+ << false << Ex->getSourceRange(),
-+ Ex->getLocStart(), /*IsStringLocation*/false,
-+ getSpecifierRange(startSpecifier, specifierLen));
-+
-+ return true;
-+ }
-+
- // Check for using an Objective-C specific conversion specifier
- // in a non-ObjC literal.
- if (!ObjCContext && CS.isObjCArg()) {
-@@ -4007,7 +4045,8 @@ void Sema::CheckFormatString(const StringLiteral *
- return;
- }
-
-- if (Type == FST_Printf || Type == FST_NSString) {
-+ if (Type == FST_Printf || Type == FST_NSString ||
-+ Type == FST_FreeBSDKPrintf) {
- CheckPrintfHandler H(*this, FExpr, OrigFormatExpr, firstDataArg,
- numDataArgs, (Type == FST_NSString),
- Str, HasVAListArg, Args, format_idx,
-@@ -4015,7 +4054,8 @@ void Sema::CheckFormatString(const StringLiteral *
-
- if (!analyze_format_string::ParsePrintfString(H, Str, Str + StrLen,
- getLangOpts(),
-- Context.getTargetInfo()))
-+ Context.getTargetInfo(),
-+ Type == FST_FreeBSDKPrintf))
- H.DoneProcessing();
- } else if (Type == FST_Scanf) {
- CheckScanfHandler H(*this, FExpr, OrigFormatExpr, firstDataArg, numDataArgs,
-Index: tools/clang/lib/Sema/SemaDeclAttr.cpp
-===================================================================
---- tools/clang/lib/Sema/SemaDeclAttr.cpp
-+++ tools/clang/lib/Sema/SemaDeclAttr.cpp
-@@ -2481,6 +2481,7 @@ static FormatAttrKind getFormatAttrKind(StringRef
- .Cases("scanf", "printf", "printf0", "strfmon", SupportedFormat)
- .Cases("cmn_err", "vcmn_err", "zcmn_err", SupportedFormat)
- .Case("kprintf", SupportedFormat) // OpenBSD.
-+ .Case("freebsd_kprintf", SupportedFormat) // FreeBSD.
-
- .Cases("gcc_diag", "gcc_cdiag", "gcc_cxxdiag", "gcc_tdiag", IgnoredFormat)
- .Default(InvalidFormat);
-Index: tools/clang/test/Sema/attr-format.c
-===================================================================
---- tools/clang/test/Sema/attr-format.c
-+++ tools/clang/test/Sema/attr-format.c
-@@ -57,8 +57,15 @@ void callnull(void){
- null(0, (int*)0); // expected-warning {{incompatible pointer types}}
- }
-
-+// FreeBSD kernel extensions
-+void a3(const char *a, ...) __attribute__((format(freebsd_kprintf, 1,2))); // no-error
-+void b3(const char *a, ...) __attribute__((format(freebsd_kprintf, 1,1))); // expected-error {{'format' attribute parameter 3 is out of bounds}}
-+void c3(const char *a, ...) __attribute__((format(freebsd_kprintf, 0,2))); // expected-error {{'format' attribute parameter 2 is out of bounds}}
-+void d3(const char *a, int c) __attribute__((format(freebsd_kprintf, 1,2))); // expected-error {{format attribute requires variadic function}}
-+void e3(char *str, int c, ...) __attribute__((format(freebsd_kprintf, 2,3))); // expected-error {{format argument not a string type}}
-
-
-+
- // PR4470
- int xx_vprintf(const char *, va_list);
-
-Index: tools/clang/test/Sema/format-strings-freebsd.c
-===================================================================
---- tools/clang/test/Sema/format-strings-freebsd.c
-+++ tools/clang/test/Sema/format-strings-freebsd.c
-@@ -0,0 +1,40 @@
-+// RUN: %clang_cc1 -fsyntax-only -verify -triple i386-unknown-freebsd %s
-+// RUN: %clang_cc1 -fsyntax-only -verify -triple x86_64-unknown-freebsd %s
-+
-+// Test FreeBSD kernel printf extensions.
-+int freebsd_kernel_printf(const char *, ...) __attribute__((__format__(__freebsd_kprintf__, 1, 2)));
-+
-+void check_freebsd_kernel_extensions(int i, long l, char *s)
-+{
-+ // %b expects an int and a char *
-+ freebsd_kernel_printf("reg=%b\n", i, "\10\2BITTWO\1BITONE\n"); // no-warning
-+ freebsd_kernel_printf("reg=%b\n", l, "\10\2BITTWO\1BITONE\n"); // expected-warning{{format specifies type 'int' but the argument has type 'long'}}
-+ freebsd_kernel_printf("reg=%b\n", i, l); // expected-warning{{format specifies type 'char *' but the argument has type 'long'}}
-+ freebsd_kernel_printf("reg=%b\n", i); // expected-warning{{more '%' conversions than data arguments}}
-+ freebsd_kernel_printf("reg=%b\n", i, "\10\2BITTWO\1BITONE\n", l); // expected-warning{{data argument not used by format string}}
-+
-+ // %D expects an unsigned char * and a char *
-+ freebsd_kernel_printf("%6D", s, ":"); // no-warning
-+ freebsd_kernel_printf("%6D", i, ":"); // expected-warning{{format specifies type 'void *' but the argument has type 'int'}}
-+ freebsd_kernel_printf("%6D", s, i); // expected-warning{{format specifies type 'char *' but the argument has type 'int'}}
-+ freebsd_kernel_printf("%6D", s); // expected-warning{{more '%' conversions than data arguments}}
-+ freebsd_kernel_printf("%6D", s, ":", i); // expected-warning{{data argument not used by format string}}
-+
-+ freebsd_kernel_printf("%*D", 42, s, ":"); // no-warning
-+ freebsd_kernel_printf("%*D", 42, i, ":"); // expected-warning{{format specifies type 'void *' but the argument has type 'int'}}
-+ freebsd_kernel_printf("%*D", 42, s, i); // expected-warning{{format specifies type 'char *' but the argument has type 'int'}}
-+ freebsd_kernel_printf("%*D", 42, s); // expected-warning{{more '%' conversions than data arguments}}
-+ freebsd_kernel_printf("%*D", 42, s, ":", i); // expected-warning{{data argument not used by format string}}
-+
-+ // %r expects an int
-+ freebsd_kernel_printf("%r", i); // no-warning
-+ freebsd_kernel_printf("%r", l); // expected-warning{{format specifies type 'int' but the argument has type 'long'}}
-+ freebsd_kernel_printf("%lr", i); // expected-warning{{format specifies type 'long' but the argument has type 'int'}}
-+ freebsd_kernel_printf("%lr", l); // no-warning
-+
-+ // %y expects an int
-+ freebsd_kernel_printf("%y", i); // no-warning
-+ freebsd_kernel_printf("%y", l); // expected-warning{{format specifies type 'int' but the argument has type 'long'}}
-+ freebsd_kernel_printf("%ly", i); // expected-warning{{format specifies type 'long' but the argument has type 'int'}}
-+ freebsd_kernel_printf("%ly", l); // no-warning
-+}
OpenPOWER on IntegriCloud