Sync in bits from base.

Index: Makefile
===================================================================
RCS file: /home/cvs/ports/devel/llvm/Makefile,v
retrieving revision 1.204
diff -u -p -u -p -r1.204 Makefile
--- Makefile    5 Jan 2019 11:38:49 -0000       1.204
+++ Makefile    12 Jan 2019 00:30:58 -0000
@@ -20,9 +20,9 @@ PKGSPEC-main =        llvm-=${LLVM_V}
 PKGNAME-main = llvm-${LLVM_V}
 PKGNAME-python =       py-llvm-${LLVM_V}
 PKGNAME-lldb = lldb-${LLVM_V}
-REVISION-main =        22
-REVISION-python = 4
-REVISION-lldb =        1
+REVISION-main =        23
+REVISION-python = 5
+REVISION-lldb =        2
 CATEGORIES =   devel
 DISTFILES =    llvm-${LLVM_V}.src${EXTRACT_SUFX} \
                cfe-${LLVM_V}.src${EXTRACT_SUFX} \
@@ -87,6 +87,15 @@ CONFIGURE_ARGS =     -DLLVM_ENABLE_FFI:Bool=
                        -DLLVM_BUILD_LLVM_DYLIB:Bool=True \
                        -DGO_EXECUTABLE=GO_EXECUTABLE-NOTFOUND \
                        -DBacktrace_LIBRARY=''
+
+# Disable some protections in the compiler to regain performance
+.if ${MACHINE_ARCH} == "aarch64" || ${MACHINE_ARCH} == "amd64" || \
+    ${MACHINE_ARCH} == "i386"
+CXXFLAGS +=    -fno-ret-protector
+.endif
+.if ${MACHINE_ARCH} == "amd64" || ${MACHINE_ARCH} == "i386"
+CXXFLAGS +=    -mno-retpoline
+.endif
 
 # Workaround relocation overflow
 .if ${MACHINE_ARCH} == "powerpc"
Index: patches/patch-lib_Target_X86_X86Subtarget_cpp
===================================================================
RCS file: patches/patch-lib_Target_X86_X86Subtarget_cpp
diff -N patches/patch-lib_Target_X86_X86Subtarget_cpp
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-lib_Target_X86_X86Subtarget_cpp       13 Jan 2019 19:37:30 
-0000
@@ -0,0 +1,22 @@
+$OpenBSD$
+
+Turn on -mretpoline by default in clang on amd64.
+
+Index: lib/Target/X86/X86Subtarget.cpp
+--- lib/Target/X86/X86Subtarget.cpp.orig
++++ lib/Target/X86/X86Subtarget.cpp
+@@ -207,6 +207,14 @@ void X86Subtarget::initSubtargetFeatures(StringRef CPU
+       FullFS = "+sahf";
+   }
+ 
++  // OpenBSD/amd64 defaults to -mretpoline.
++  if (isTargetOpenBSD() && In64BitMode) {
++    if (!FullFS.empty())
++      FullFS = "+retpoline," + FullFS;
++    else
++      FullFS = "+retpoline";
++  }
++
+   // Parse features string and set the CPU.
+   ParseSubtargetFeatures(CPUName, FullFS);
+ 
Index: patches/patch-lib_Target_X86_X86Subtarget_h
===================================================================
RCS file: patches/patch-lib_Target_X86_X86Subtarget_h
diff -N patches/patch-lib_Target_X86_X86Subtarget_h
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-lib_Target_X86_X86Subtarget_h 13 Jan 2019 19:37:40 -0000
@@ -0,0 +1,15 @@
+$OpenBSD$
+
+Turn on -mretpoline by default in clang on amd64.
+
+Index: lib/Target/X86/X86Subtarget.h
+--- lib/Target/X86/X86Subtarget.h.orig
++++ lib/Target/X86/X86Subtarget.h
+@@ -603,6 +603,7 @@ class X86Subtarget final : public X86GenSubtargetInfo 
+ 
+   bool isTargetDarwin() const { return TargetTriple.isOSDarwin(); }
+   bool isTargetFreeBSD() const { return TargetTriple.isOSFreeBSD(); }
++  bool isTargetOpenBSD() const { return TargetTriple.isOSOpenBSD(); }
+   bool isTargetDragonFly() const { return TargetTriple.isOSDragonFly(); }
+   bool isTargetSolaris() const { return TargetTriple.isOSSolaris(); }
+   bool isTargetPS4() const { return TargetTriple.isPS4CPU(); }
Index: patches/patch-tools_clang_include_clang_Analysis_Analyses_FormatString_h
===================================================================
RCS file: 
patches/patch-tools_clang_include_clang_Analysis_Analyses_FormatString_h
diff -N patches/patch-tools_clang_include_clang_Analysis_Analyses_FormatString_h
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-tools_clang_include_clang_Analysis_Analyses_FormatString_h    
12 Jan 2019 22:57:25 -0000
@@ -0,0 +1,22 @@
+$OpenBSD$
+
+The %b printf extension in the kernel is not fixed to a int type. On sparc64
+there are various %llb formats. Adjust the code to handle the length specifiers
+and type check like it is used by the regular case.
+
+Index: tools/clang/include/clang/Analysis/Analyses/FormatString.h
+--- tools/clang/include/clang/Analysis/Analyses/FormatString.h.orig
++++ tools/clang/include/clang/Analysis/Analyses/FormatString.h
+@@ -227,8 +227,10 @@ class ConversionSpecifier { (public)
+ 
+   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; }
++  bool isUIntArg() const { return (kind >= UIntArgBeg && kind <= UIntArgEnd) 
||
++    kind == FreeBSDbArg; }
++  bool isAnyIntArg() const { return (kind >= IntArgBeg && kind <= UIntArgEnd) 
||
++    kind == FreeBSDbArg; }
+   bool isDoubleArg() const {
+     return kind >= DoubleArgBeg && kind <= DoubleArgEnd;
+   }
Index: patches/patch-tools_clang_lib_Analysis_FormatString_cpp
===================================================================
RCS file: patches/patch-tools_clang_lib_Analysis_FormatString_cpp
diff -N patches/patch-tools_clang_lib_Analysis_FormatString_cpp
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-tools_clang_lib_Analysis_FormatString_cpp     12 Jan 2019 
22:57:50 -0000
@@ -0,0 +1,39 @@
+$OpenBSD$
+
+The %b printf extension in the kernel is not fixed to a int type. On sparc64
+there are various %llb formats. Adjust the code to handle the length specifiers
+and type check like it is used by the regular case.
+
+Index: tools/clang/lib/Analysis/FormatString.cpp
+--- tools/clang/lib/Analysis/FormatString.cpp.orig
++++ tools/clang/lib/Analysis/FormatString.cpp
+@@ -706,6 +706,10 @@ bool FormatSpecifier::hasValidLengthModifier(const Tar
+         case ConversionSpecifier::XArg:
+         case ConversionSpecifier::nArg:
+           return true;
++        case ConversionSpecifier::FreeBSDbArg:
++          return Target.getTriple().isOSFreeBSD() ||
++                 Target.getTriple().isPS4() ||
++                 Target.getTriple().isOSOpenBSD();
+         case ConversionSpecifier::FreeBSDrArg:
+         case ConversionSpecifier::FreeBSDyArg:
+           return Target.getTriple().isOSFreeBSD() || 
Target.getTriple().isPS4();
+@@ -739,6 +743,10 @@ bool FormatSpecifier::hasValidLengthModifier(const Tar
+         case ConversionSpecifier::ScanListArg:
+         case ConversionSpecifier::ZArg:
+           return true;
++        case ConversionSpecifier::FreeBSDbArg:
++          return Target.getTriple().isOSFreeBSD() ||
++                 Target.getTriple().isPS4() ||
++                 Target.getTriple().isOSOpenBSD();
+         case ConversionSpecifier::FreeBSDrArg:
+         case ConversionSpecifier::FreeBSDyArg:
+           return Target.getTriple().isOSFreeBSD() || 
Target.getTriple().isPS4();
+@@ -897,6 +905,7 @@ bool FormatSpecifier::hasStandardLengthConversionCombi
+         case ConversionSpecifier::uArg:
+         case ConversionSpecifier::xArg:
+         case ConversionSpecifier::XArg:
++        case ConversionSpecifier::FreeBSDbArg:
+           return false;
+         default:
+           return true;
Index: patches/patch-tools_clang_lib_Sema_SemaChecking_cpp
===================================================================
RCS file: 
/home/cvs/ports/devel/llvm/patches/patch-tools_clang_lib_Sema_SemaChecking_cpp,v
retrieving revision 1.4
diff -u -p -u -p -r1.4 patch-tools_clang_lib_Sema_SemaChecking_cpp
--- patches/patch-tools_clang_lib_Sema_SemaChecking_cpp 7 Apr 2018 14:55:42 
-0000       1.4
+++ patches/patch-tools_clang_lib_Sema_SemaChecking_cpp 12 Jan 2019 22:59:06 
-0000
@@ -2,6 +2,9 @@ $OpenBSD: patch-tools_clang_lib_Sema_Sem
 
 - Teach Clang about syslog format attribute
 - Enable the kprintf format attribute
+- The %b printf extension in the kernel is not fixed to a int type. On sparc64
+  there are various %llb formats. Adjust the code to handle the length
+  specifiers and type check like it is used by the regular case.
 
 Index: tools/clang/lib/Sema/SemaChecking.cpp
 --- tools/clang/lib/Sema/SemaChecking.cpp.orig
@@ -23,7 +26,52 @@ Index: tools/clang/lib/Sema/SemaChecking
        Diag(FormatLoc, diag::note_format_security_fixit)
          << FixItHint::CreateInsertion(FormatLoc, "\"%s\", ");
        break;
-@@ -6777,8 +6778,9 @@ static void CheckFormatString(Sema &S, const FormatStr
+@@ -6053,19 +6054,33 @@ CheckPrintfHandler::HandlePrintfSpecifier(const analyz
+     // 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));
++    if (CS.getKind() == ConversionSpecifier::FreeBSDDArg) {
++      // Type check the first argument (pointer for %D)
++      const analyze_printf::ArgType &AT = 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));
++    } else {
++      // Check the length modifier for %b
++      if (!FS.hasValidLengthModifier(S.getASTContext().getTargetInfo()))
++        HandleInvalidLengthModifier(FS, CS, startSpecifier, specifierLen,
++                                    diag::warn_format_nonsensical_length);
++      else if (!FS.hasStandardLengthModifier())
++        HandleNonStandardLengthModifier(FS, startSpecifier, specifierLen);
++      else if (!FS.hasStandardLengthConversionCombination())
++        HandleInvalidLengthModifier(FS, CS, startSpecifier, specifierLen,
++                                    
diag::warn_format_non_standard_conversion_spec);
+ 
++      // Type check the first argument of %b
++      if (!checkFormatExpr(FS, startSpecifier, specifierLen, Ex))
++        return false;
++    }
++
+     // Type check the second argument (char * for both %b and %D)
+     Ex = getDataArg(argIndex + 1);
+     const analyze_printf::ArgType &AT2 = ArgType::CStrTy;
+@@ -6777,8 +6792,9 @@ static void CheckFormatString(Sema &S, const FormatStr
    }
  
    if (Type == Sema::FST_Printf || Type == Sema::FST_NSString ||
@@ -35,7 +83,7 @@ Index: tools/clang/lib/Sema/SemaChecking
      CheckPrintfHandler H(
          S, FExpr, OrigFormatExpr, Type, firstDataArg, numDataArgs,
          (Type == Sema::FST_NSString || Type == Sema::FST_OSTrace), Str,
-@@ -6788,7 +6790,7 @@ static void CheckFormatString(Sema &S, const FormatStr
+@@ -6788,7 +6804,7 @@ static void CheckFormatString(Sema &S, const FormatStr
      if (!analyze_format_string::ParsePrintfString(H, Str, Str + StrLen,
                                                    S.getLangOpts(),
                                                    S.Context.getTargetInfo(),

Reply via email to