From 917bd23891f6882d9e815e1f72e130a23cdb2893 Mon Sep 17 00:00:00 2001 From: serge-sans-paille Date: Feb 19 2019 12:56:00 +0000 Subject: Compatibility package - clang7.0 --- diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0454c24 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/cfe-7.0.1.src.tar.xz diff --git a/0001-CMake-Fix-pthread-handling-for-out-of-tree-builds.patch b/0001-CMake-Fix-pthread-handling-for-out-of-tree-builds.patch new file mode 100644 index 0000000..e6bb267 --- /dev/null +++ b/0001-CMake-Fix-pthread-handling-for-out-of-tree-builds.patch @@ -0,0 +1,36 @@ +From f5f712dfcac6ee99381c5aca212950276f1743e8 Mon Sep 17 00:00:00 2001 +From: Eric Fiselier +Date: Fri, 10 Feb 2017 01:59:20 +0000 +Subject: [PATCH] [CMake] Fix pthread handling for out-of-tree builds + +LLVM defines `PTHREAD_LIB` which is used by AddLLVM.cmake and various projects +to correctly link the threading library when needed. Unfortunately +`PTHREAD_LIB` is defined by LLVM's `config-ix.cmake` file which isn't installed +and therefore can't be used when configuring out-of-tree builds. This causes +such builds to fail since `pthread` isn't being correctly linked. + +This patch attempts to fix that problem by renaming and exporting +`LLVM_PTHREAD_LIB` as part of`LLVMConfig.cmake`. I renamed `PTHREAD_LIB` +because It seemed likely to cause collisions with downstream users of +`LLVMConfig.cmake`. + + +git-svn-id: https://llvm.org/svn/llvm-project/clang-tools-extra/trunk@294690 91177308-0d34-0410-b5e6-96231b3b80d8 +--- + include-fixer/plugin/CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/include-fixer/plugin/CMakeLists.txt b/include-fixer/plugin/CMakeLists.txt +index 2799fd4..df792ea 100644 +--- a/include-fixer/plugin/CMakeLists.txt ++++ b/include-fixer/plugin/CMakeLists.txt +@@ -9,5 +9,5 @@ add_clang_library(clangIncludeFixerPlugin + clangParse + clangSema + clangTooling +- ${PTHREAD_LIB} ++ ${LLVM_PTHREAD_LIB} + ) +-- +1.8.3.1 + diff --git a/0001-CodeGen-Handle-mixed-width-ops-in-mixed-sign-mul-wit.patch b/0001-CodeGen-Handle-mixed-width-ops-in-mixed-sign-mul-wit.patch new file mode 100644 index 0000000..4c07bad --- /dev/null +++ b/0001-CodeGen-Handle-mixed-width-ops-in-mixed-sign-mul-wit.patch @@ -0,0 +1,122 @@ +From b9d6dba608ab50d2e4a1b0f2318a5d1b390fc702 Mon Sep 17 00:00:00 2001 +From: Vedant Kumar +Date: Tue, 18 Dec 2018 21:05:03 +0000 +Subject: [PATCH] [CodeGen] Handle mixed-width ops in mixed-sign + mul-with-overflow lowering + +The special lowering for __builtin_mul_overflow introduced in r320902 +fixed an ICE seen when passing mixed-sign operands to the builtin. + +This patch extends the special lowering to cover mixed-width, mixed-sign +operands. In a few common scenarios, calls to muloti4 will no longer be +emitted. + +This should address the latest comments in PR34920 and work around the +link failure seen in: + + https://bugzilla.redhat.com/show_bug.cgi?id=1657544 + +Testing: +- check-clang +- A/B output comparison with: https://gist.github.com/vedantk/3eb9c88f82e5c32f2e590555b4af5081 + +Differential Revision: https://reviews.llvm.org/D55843 + +git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@349542 91177308-0d34-0410-b5e6-96231b3b80d8 +--- + lib/CodeGen/CGBuiltin.cpp | 19 ++++++++++++++----- + test/CodeGen/builtins-overflow.c | 21 +++++++++++++++++++++ + 2 files changed, 35 insertions(+), 5 deletions(-) + +diff --git a/lib/CodeGen/CGBuiltin.cpp b/lib/CodeGen/CGBuiltin.cpp +index 0770c20..4303a7a 100644 +--- a/lib/CodeGen/CGBuiltin.cpp ++++ b/lib/CodeGen/CGBuiltin.cpp +@@ -1077,7 +1077,7 @@ static bool isSpecialMixedSignMultiply(unsigned BuiltinID, + WidthAndSignedness Op2Info, + WidthAndSignedness ResultInfo) { + return BuiltinID == Builtin::BI__builtin_mul_overflow && +- Op1Info.Width == Op2Info.Width && Op1Info.Width >= ResultInfo.Width && ++ std::max(Op1Info.Width, Op2Info.Width) >= ResultInfo.Width && + Op1Info.Signed != Op2Info.Signed; + } + +@@ -1098,11 +1098,20 @@ EmitCheckedMixedSignMultiply(CodeGenFunction &CGF, const clang::Expr *Op1, + const clang::Expr *UnsignedOp = Op1Info.Signed ? Op2 : Op1; + llvm::Value *Signed = CGF.EmitScalarExpr(SignedOp); + llvm::Value *Unsigned = CGF.EmitScalarExpr(UnsignedOp); ++ unsigned SignedOpWidth = Op1Info.Signed ? Op1Info.Width : Op2Info.Width; ++ unsigned UnsignedOpWidth = Op1Info.Signed ? Op2Info.Width : Op1Info.Width; ++ ++ // One of the operands may be smaller than the other. If so, [s|z]ext it. ++ if (SignedOpWidth < UnsignedOpWidth) ++ Signed = CGF.Builder.CreateSExt(Signed, Unsigned->getType(), "op.sext"); ++ if (UnsignedOpWidth < SignedOpWidth) ++ Unsigned = CGF.Builder.CreateZExt(Unsigned, Signed->getType(), "op.zext"); + + llvm::Type *OpTy = Signed->getType(); + llvm::Value *Zero = llvm::Constant::getNullValue(OpTy); + Address ResultPtr = CGF.EmitPointerWithAlignment(ResultArg); + llvm::Type *ResTy = ResultPtr.getElementType(); ++ unsigned OpWidth = std::max(Op1Info.Width, Op2Info.Width); + + // Take the absolute value of the signed operand. + llvm::Value *IsNegative = CGF.Builder.CreateICmpSLT(Signed, Zero); +@@ -1120,8 +1129,8 @@ EmitCheckedMixedSignMultiply(CodeGenFunction &CGF, const clang::Expr *Op1, + if (ResultInfo.Signed) { + // Signed overflow occurs if the result is greater than INT_MAX or lesser + // than INT_MIN, i.e when |Result| > (INT_MAX + IsNegative). +- auto IntMax = llvm::APInt::getSignedMaxValue(ResultInfo.Width) +- .zextOrSelf(Op1Info.Width); ++ auto IntMax = ++ llvm::APInt::getSignedMaxValue(ResultInfo.Width).zextOrSelf(OpWidth); + llvm::Value *MaxResult = + CGF.Builder.CreateAdd(llvm::ConstantInt::get(OpTy, IntMax), + CGF.Builder.CreateZExt(IsNegative, OpTy)); +@@ -1139,9 +1148,9 @@ EmitCheckedMixedSignMultiply(CodeGenFunction &CGF, const clang::Expr *Op1, + llvm::Value *Underflow = CGF.Builder.CreateAnd( + IsNegative, CGF.Builder.CreateIsNotNull(UnsignedResult)); + Overflow = CGF.Builder.CreateOr(UnsignedOverflow, Underflow); +- if (ResultInfo.Width < Op1Info.Width) { ++ if (ResultInfo.Width < OpWidth) { + auto IntMax = +- llvm::APInt::getMaxValue(ResultInfo.Width).zext(Op1Info.Width); ++ llvm::APInt::getMaxValue(ResultInfo.Width).zext(OpWidth); + llvm::Value *TruncOverflow = CGF.Builder.CreateICmpUGT( + UnsignedResult, llvm::ConstantInt::get(OpTy, IntMax)); + Overflow = CGF.Builder.CreateOr(Overflow, TruncOverflow); +diff --git a/test/CodeGen/builtins-overflow.c b/test/CodeGen/builtins-overflow.c +index 57f90eb..79a3186 100644 +--- a/test/CodeGen/builtins-overflow.c ++++ b/test/CodeGen/builtins-overflow.c +@@ -339,6 +339,27 @@ long long test_smulll_overflow(long long x, long long y) { + return result; + } + ++int test_mixed_sign_mul_overflow_sext_signed_op(int x, unsigned long long y) { ++// CHECK: @test_mixed_sign_mul_overflow_sext_signed_op ++// CHECK: [[SignedOp:%.*]] = sext i32 %0 to i64 ++// CHECK: [[IsNeg:%.*]] = icmp slt i64 [[SignedOp]], 0 ++ int result; ++ if (__builtin_mul_overflow(x, y, &result)) ++ return LongErrorCode; ++ return result; ++} ++ ++int test_mixed_sign_mul_overflow_zext_unsigned_op(long long x, unsigned y) { ++// CHECK: @test_mixed_sign_mul_overflow_zext_unsigned_op ++// CHECK: [[UnsignedOp:%.*]] = zext i32 %1 to i64 ++// CHECK: [[IsNeg:%.*]] = icmp slt i64 %0, 0 ++// CHECK: @llvm.umul.with.overflow.i64({{.*}}, i64 [[UnsignedOp]]) ++ int result; ++ if (__builtin_mul_overflow(x, y, &result)) ++ return LongErrorCode; ++ return result; ++} ++ + int test_mixed_sign_mull_overflow(int x, unsigned y) { + // CHECK: @test_mixed_sign_mull_overflow + // CHECK: [[IsNeg:%.*]] = icmp slt i32 [[Op1:%.*]], 0 +-- +1.8.3.1 + diff --git a/0001-Convert-clang-format-diff.py-to-python3-using-2to3.patch b/0001-Convert-clang-format-diff.py-to-python3-using-2to3.patch new file mode 100644 index 0000000..2c15ece --- /dev/null +++ b/0001-Convert-clang-format-diff.py-to-python3-using-2to3.patch @@ -0,0 +1,52 @@ +From a1bccf89a02accab69b359ef004faa95257333c0 Mon Sep 17 00:00:00 2001 +From: Tom Stellard +Date: Fri, 7 Sep 2018 18:27:16 +0000 +Subject: [PATCH] Convert clang-format-diff.py to python3 using 2to3 + +--- + tools/clang-format/clang-format-diff.py | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/tools/clang-format/clang-format-diff.py b/tools/clang-format/clang-format-diff.py +index ffa30e70dd..1525a3815c 100755 +--- a/tools/clang-format/clang-format-diff.py ++++ b/tools/clang-format/clang-format-diff.py +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/python3 + # + #===- clang-format-diff.py - ClangFormat Diff Reformatter ----*- python -*--===# + # +@@ -27,7 +27,7 @@ import difflib + import re + import string + import subprocess +-import StringIO ++import io + import sys + + +@@ -89,9 +89,9 @@ def main(): + ['-lines', str(start_line) + ':' + str(end_line)]) + + # Reformat files containing changes in place. +- for filename, lines in lines_by_file.iteritems(): ++ for filename, lines in lines_by_file.items(): + if args.i and args.verbose: +- print 'Formatting', filename ++ print('Formatting', filename) + command = [args.binary, filename] + if args.i: + command.append('-i') +@@ -109,7 +109,7 @@ def main(): + if not args.i: + with open(filename) as f: + code = f.readlines() +- formatted_code = StringIO.StringIO(stdout).readlines() ++ formatted_code = io.StringIO(stdout).readlines() + diff = difflib.unified_diff(code, formatted_code, + filename, filename, + '(before formatting)', '(after formatting)') +-- +2.14.3 + diff --git a/0001-Convert-run-find-all-symbols.py-to-python3-using-2to.patch b/0001-Convert-run-find-all-symbols.py-to-python3-using-2to.patch new file mode 100644 index 0000000..620f80d --- /dev/null +++ b/0001-Convert-run-find-all-symbols.py-to-python3-using-2to.patch @@ -0,0 +1,61 @@ +From 6430ef09aecb30bce588c2d7f35b2294d219c835 Mon Sep 17 00:00:00 2001 +From: Tom Stellard +Date: Mon, 26 Nov 2018 19:18:12 -0800 +Subject: [PATCH] Convert run-find-all-symbols.py to python3 using 2to3 + +--- + include-fixer/find-all-symbols/tool/run-find-all-symbols.py | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/include-fixer/find-all-symbols/tool/run-find-all-symbols.py b/include-fixer/find-all-symbols/tool/run-find-all-symbols.py +index 461d959..89a6cf5 100755 +--- a/include-fixer/find-all-symbols/tool/run-find-all-symbols.py ++++ b/include-fixer/find-all-symbols/tool/run-find-all-symbols.py +@@ -27,7 +27,7 @@ import argparse + import json + import multiprocessing + import os +-import Queue ++import queue + import shutil + import subprocess + import sys +@@ -40,7 +40,7 @@ def find_compilation_database(path): + result = './' + while not os.path.isfile(os.path.join(result, path)): + if os.path.realpath(result) == '/': +- print 'Error: could not find compilation database.' ++ print('Error: could not find compilation database.') + sys.exit(1) + result += '../' + return os.path.realpath(result) +@@ -50,7 +50,7 @@ def MergeSymbols(directory, args): + """Merge all symbol files (yaml) in a given directaory into a single file.""" + invocation = [args.binary, '-merge-dir='+directory, args.saving_path] + subprocess.call(invocation) +- print 'Merge is finished. Saving results in ' + args.saving_path ++ print('Merge is finished. Saving results in ' + args.saving_path) + + + def run_find_all_symbols(args, tmpdir, build_path, queue): +@@ -96,7 +96,7 @@ def main(): + + try: + # Spin up a bunch of tidy-launching threads. +- queue = Queue.Queue(max_task) ++ queue = queue.Queue(max_task) + for _ in range(max_task): + t = threading.Thread(target=run_find_all_symbols, + args=(args, tmpdir, build_path, queue)) +@@ -116,7 +116,7 @@ def main(): + except KeyboardInterrupt: + # This is a sad hack. Unfortunately subprocess goes + # bonkers with ctrl-c and we start forking merrily. +- print '\nCtrl-C detected, goodbye.' ++ print('\nCtrl-C detected, goodbye.') + os.kill(0, 9) + + +-- +1.8.3.1 + diff --git a/0001-Convert-scan-view-to-python3-using-2to3.patch b/0001-Convert-scan-view-to-python3-using-2to3.patch new file mode 100644 index 0000000..9384ce7 --- /dev/null +++ b/0001-Convert-scan-view-to-python3-using-2to3.patch @@ -0,0 +1,411 @@ +diff -r -u cfe-7.0.1.src.orig/tools/scan-view/bin/scan-view cfe-7.0.1.src/tools/scan-view/bin/scan-view +--- cfe-7.0.1.src.orig/tools/scan-view/bin/scan-view 2019-01-25 06:33:02.331385931 +0000 ++++ cfe-7.0.1.src/tools/scan-view/bin/scan-view 2019-01-25 06:34:16.207696772 +0000 +@@ -7,9 +7,9 @@ + import imp + import os + import posixpath +-import thread ++import _thread + import time +-import urllib ++import urllib.request, urllib.parse, urllib.error + import webbrowser + + # How long to wait for server to start. +@@ -27,7 +27,7 @@ + + def url_is_up(url): + try: +- o = urllib.urlopen(url) ++ o = urllib.request.urlopen(url) + except IOError: + return False + o.close() +@@ -35,7 +35,7 @@ + + + def start_browser(port, options): +- import urllib ++ import urllib.request, urllib.parse, urllib.error + import webbrowser + + url = 'http://%s:%d' % (options.host, port) +@@ -52,10 +52,10 @@ + sys.stderr.flush() + time.sleep(kSleepTimeout) + else: +- print >> sys.stderr, 'WARNING: Unable to detect that server started.' ++ print('WARNING: Unable to detect that server started.', file=sys.stderr) + + if options.debug: +- print >> sys.stderr, '%s: Starting webbrowser...' % sys.argv[0] ++ print('%s: Starting webbrowser...' % sys.argv[0], file=sys.stderr) + webbrowser.open(url) + + +@@ -69,9 +69,9 @@ + + import ScanView + try: +- print 'Starting scan-view at: http://%s:%d' % (options.host, +- port) +- print ' Use Ctrl-C to exit.' ++ print('Starting scan-view at: http://%s:%d' % (options.host, ++ port)) ++ print(' Use Ctrl-C to exit.') + httpd = ScanView.create_server((options.host, port), + options, root) + httpd.serve_forever() +@@ -80,9 +80,9 @@ + + + def port_is_open(port): +- import SocketServer ++ import socketserver + try: +- t = SocketServer.TCPServer((kDefaultHost, port), None) ++ t = socketserver.TCPServer((kDefaultHost, port), None) + except: + return False + t.server_close() +@@ -135,7 +135,7 @@ + # Kick off thread to wait for server and start web browser, if + # requested. + if args.startBrowser: +- t = thread.start_new_thread(start_browser, (port, args)) ++ t = _thread.start_new_thread(start_browser, (port, args)) + + run(port, args, args.root) + +diff -r -u cfe-7.0.1.src.orig/tools/scan-view/share/Reporter.py cfe-7.0.1.src/tools/scan-view/share/Reporter.py +--- cfe-7.0.1.src.orig/tools/scan-view/share/Reporter.py 2019-01-25 06:33:02.331385931 +0000 ++++ cfe-7.0.1.src/tools/scan-view/share/Reporter.py 2019-01-25 06:34:16.262697004 +0000 +@@ -80,7 +80,7 @@ + return 'Email' + + def getParameters(self): +- return map(lambda x:TextParameter(x),['To', 'From', 'SMTP Server', 'SMTP Port']) ++ return [TextParameter(x) for x in ['To', 'From', 'SMTP Server', 'SMTP Port']] + + # Lifted from python email module examples. + def attachFile(self, outer, path): +@@ -148,7 +148,7 @@ + return 'Bugzilla' + + def getParameters(self): +- return map(lambda x:TextParameter(x),['URL','Product']) ++ return [TextParameter(x) for x in ['URL','Product']] + + def fileReport(self, report, parameters): + raise NotImplementedError +@@ -211,7 +211,7 @@ + + script = os.path.join(os.path.dirname(__file__),'../share/scan-view/FileRadar.scpt') + args = ['osascript', script, component, componentVersion, classification, personID, report.title, +- report.description, diagnosis, config] + map(os.path.abspath, report.files) ++ report.description, diagnosis, config] + list(map(os.path.abspath, report.files)) + # print >>sys.stderr, args + try: + p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) +diff -r -u cfe-7.0.1.src.orig/tools/scan-view/share/ScanView.py cfe-7.0.1.src/tools/scan-view/share/ScanView.py +--- cfe-7.0.1.src.orig/tools/scan-view/share/ScanView.py 2019-01-25 06:33:02.331385931 +0000 ++++ cfe-7.0.1.src/tools/scan-view/share/ScanView.py 2019-01-25 06:34:16.423697681 +0000 +@@ -1,10 +1,10 @@ +-import BaseHTTPServer +-import SimpleHTTPServer ++import http.server ++import http.server + import os + import sys +-import urllib, urlparse ++import urllib.request, urllib.parse, urllib.error, urllib.parse + import posixpath +-import StringIO ++import io + import re + import shutil + import threading +@@ -13,7 +13,8 @@ + import itertools + + import Reporter +-import ConfigParser ++import configparser ++import importlib + + ### + # Various patterns matched or replaced by server. +@@ -96,25 +97,25 @@ + result = None + try: + if self.server.options.debug: +- print >>sys.stderr, "%s: SERVER: submitting bug."%(sys.argv[0],) ++ print("%s: SERVER: submitting bug."%(sys.argv[0],), file=sys.stderr) + self.status = self.reporter.fileReport(self.report, self.parameters) + self.success = True + time.sleep(3) + if self.server.options.debug: +- print >>sys.stderr, "%s: SERVER: submission complete."%(sys.argv[0],) +- except Reporter.ReportFailure,e: ++ print("%s: SERVER: submission complete."%(sys.argv[0],), file=sys.stderr) ++ except Reporter.ReportFailure as e: + self.status = e.value +- except Exception,e: +- s = StringIO.StringIO() ++ except Exception as e: ++ s = io.StringIO() + import traceback +- print >>s,'Unhandled Exception
'
++            print('Unhandled Exception
', file=s)
+             traceback.print_exc(e,file=s)
+-            print >>s,'
' ++ print('
', file=s) + self.status = s.getvalue() + +-class ScanViewServer(BaseHTTPServer.HTTPServer): ++class ScanViewServer(http.server.HTTPServer): + def __init__(self, address, handler, root, reporters, options): +- BaseHTTPServer.HTTPServer.__init__(self, address, handler) ++ http.server.HTTPServer.__init__(self, address, handler) + self.root = root + self.reporters = reporters + self.options = options +@@ -123,7 +124,7 @@ + self.load_config() + + def load_config(self): +- self.config = ConfigParser.RawConfigParser() ++ self.config = configparser.RawConfigParser() + + # Add defaults + self.config.add_section('ScanView') +@@ -155,44 +156,44 @@ + def halt(self): + self.halted = True + if self.options.debug: +- print >>sys.stderr, "%s: SERVER: halting." % (sys.argv[0],) ++ print("%s: SERVER: halting." % (sys.argv[0],), file=sys.stderr) + + def serve_forever(self): + while not self.halted: + if self.options.debug > 1: +- print >>sys.stderr, "%s: SERVER: waiting..." % (sys.argv[0],) ++ print("%s: SERVER: waiting..." % (sys.argv[0],), file=sys.stderr) + try: + self.handle_request() +- except OSError,e: +- print 'OSError',e.errno ++ except OSError as e: ++ print('OSError',e.errno) + + def finish_request(self, request, client_address): + if self.options.autoReload: + import ScanView +- self.RequestHandlerClass = reload(ScanView).ScanViewRequestHandler +- BaseHTTPServer.HTTPServer.finish_request(self, request, client_address) ++ self.RequestHandlerClass = importlib.reload(ScanView).ScanViewRequestHandler ++ http.server.HTTPServer.finish_request(self, request, client_address) + + def handle_error(self, request, client_address): + # Ignore socket errors + info = sys.exc_info() + if info and isinstance(info[1], socket.error): + if self.options.debug > 1: +- print >>sys.stderr, "%s: SERVER: ignored socket error." % (sys.argv[0],) ++ print("%s: SERVER: ignored socket error." % (sys.argv[0],), file=sys.stderr) + return +- BaseHTTPServer.HTTPServer.handle_error(self, request, client_address) ++ http.server.HTTPServer.handle_error(self, request, client_address) + + # Borrowed from Quixote, with simplifications. + def parse_query(qs, fields=None): + if fields is None: + fields = {} +- for chunk in filter(None, qs.split('&')): ++ for chunk in [_f for _f in qs.split('&') if _f]: + if '=' not in chunk: + name = chunk + value = '' + else: + name, value = chunk.split('=', 1) +- name = urllib.unquote(name.replace('+', ' ')) +- value = urllib.unquote(value.replace('+', ' ')) ++ name = urllib.parse.unquote(name.replace('+', ' ')) ++ value = urllib.parse.unquote(value.replace('+', ' ')) + item = fields.get(name) + if item is None: + fields[name] = [value] +@@ -200,20 +201,20 @@ + item.append(value) + return fields + +-class ScanViewRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): ++class ScanViewRequestHandler(http.server.SimpleHTTPRequestHandler): + server_version = "ScanViewServer/" + __version__ + dynamic_mtime = time.time() + + def do_HEAD(self): + try: +- SimpleHTTPServer.SimpleHTTPRequestHandler.do_HEAD(self) +- except Exception,e: ++ http.server.SimpleHTTPRequestHandler.do_HEAD(self) ++ except Exception as e: + self.handle_exception(e) + + def do_GET(self): + try: +- SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self) +- except Exception,e: ++ http.server.SimpleHTTPRequestHandler.do_GET(self) ++ except Exception as e: + self.handle_exception(e) + + def do_POST(self): +@@ -230,7 +231,7 @@ + if f: + self.copyfile(f, self.wfile) + f.close() +- except Exception,e: ++ except Exception as e: + self.handle_exception(e) + + def log_message(self, format, *args): +@@ -263,8 +264,8 @@ + + def handle_exception(self, exc): + import traceback +- s = StringIO.StringIO() +- print >>s, "INTERNAL ERROR\n" ++ s = io.StringIO() ++ print("INTERNAL ERROR\n", file=s) + traceback.print_exc(exc, s) + f = self.send_string(s.getvalue(), 'text/plain') + if f: +@@ -410,8 +411,8 @@ + + import startfile + if self.server.options.debug: +- print >>sys.stderr, '%s: SERVER: opening "%s"'%(sys.argv[0], +- file) ++ print('%s: SERVER: opening "%s"'%(sys.argv[0], ++ file), file=sys.stderr) + + status = startfile.open(file) + if status: +@@ -428,7 +429,7 @@ + data = self.load_crashes() + # Don't allow empty reports. + if not data: +- raise ValueError, 'No crashes detected!' ++ raise ValueError('No crashes detected!') + c = Context() + c.title = 'clang static analyzer failures' + +@@ -472,7 +473,7 @@ + # Check that this is a valid report. + path = posixpath.join(self.server.root, 'report-%s.html' % report) + if not posixpath.exists(path): +- raise ValueError, 'Invalid report ID' ++ raise ValueError('Invalid report ID') + keys = self.load_report(report) + c = Context() + c.title = keys.get('DESC','clang error (unrecognized') +@@ -501,7 +502,7 @@ + # report is None is used for crashes + try: + c = self.get_report_context(report) +- except ValueError, e: ++ except ValueError as e: + return self.send_error(400, e.message) + + title = c.title +@@ -544,7 +545,7 @@ + """%(r.getName(),display,r.getName(),options)) + reporterSelections = '\n'.join(reporterSelections) + reporterOptionsDivs = '\n'.join(reporterOptions) +- reportersArray = '[%s]'%(','.join([`r.getName()` for r in self.server.reporters])) ++ reportersArray = '[%s]'%(','.join([repr(r.getName()) for r in self.server.reporters])) + + if c.files: + fieldSize = min(5, len(c.files)) +@@ -647,9 +648,9 @@ + fields = {} + self.fields = fields + +- o = urlparse.urlparse(self.path) ++ o = urllib.parse.urlparse(self.path) + self.fields = parse_query(o.query, fields) +- path = posixpath.normpath(urllib.unquote(o.path)) ++ path = posixpath.normpath(urllib.parse.unquote(o.path)) + + # Split the components and strip the root prefix. + components = path.split('/')[1:] +@@ -690,8 +691,8 @@ + path = posixpath.join(self.server.root, relpath) + + if self.server.options.debug > 1: +- print >>sys.stderr, '%s: SERVER: sending path "%s"'%(sys.argv[0], +- path) ++ print('%s: SERVER: sending path "%s"'%(sys.argv[0], ++ path), file=sys.stderr) + return self.send_path(path) + + def send_404(self): +@@ -735,7 +736,7 @@ + mtime = self.dynamic_mtime + self.send_header("Last-Modified", self.date_time_string(mtime)) + self.end_headers() +- return StringIO.StringIO(s) ++ return io.StringIO(s) + + def send_patched_file(self, path, ctype): + # Allow a very limited set of variables. This is pretty gross. +diff -r -u cfe-7.0.1.src.orig/tools/scan-view/share/startfile.py cfe-7.0.1.src/tools/scan-view/share/startfile.py +--- cfe-7.0.1.src.orig/tools/scan-view/share/startfile.py 2019-01-25 06:33:02.331385931 +0000 ++++ cfe-7.0.1.src/tools/scan-view/share/startfile.py 2019-01-25 06:34:16.457697824 +0000 +@@ -70,7 +70,7 @@ + return not returncode + + def open(self, filename): +- if isinstance(filename, basestring): ++ if isinstance(filename, str): + cmdline = self.args + [filename] + else: + # assume it is a sequence +@@ -110,7 +110,7 @@ + # Platform support for Unix + else: + +- import commands ++ import subprocess + + # @WARNING: use the private API of the webbrowser module + from webbrowser import _iscommand +@@ -125,7 +125,7 @@ + def detect_kde_version(self): + kde_version = None + try: +- info = commands.getoutput('kde-config --version') ++ info = subprocess.getoutput('kde-config --version') + + for line in info.splitlines(): + if line.startswith('KDE'): +@@ -158,7 +158,7 @@ + desktop_environment = 'gnome' + else: + try: +- info = commands.getoutput('xprop -root _DT_SAVE_MODE') ++ info = subprocess.getoutput('xprop -root _DT_SAVE_MODE') + if ' = "xfce4"' in info: + desktop_environment = 'xfce' + except (OSError, RuntimeError): +@@ -189,7 +189,7 @@ + return _controllers[controller_name].open + + except KeyError: +- if _controllers.has_key('xdg-open'): ++ if 'xdg-open' in _controllers: + return _controllers['xdg-open'].open + else: + return webbrowser.open diff --git a/0001-Don-t-prefer-python2.7.patch b/0001-Don-t-prefer-python2.7.patch new file mode 100644 index 0000000..28ca4e0 --- /dev/null +++ b/0001-Don-t-prefer-python2.7.patch @@ -0,0 +1,24 @@ +From d13bd5108e3471cc6f6203ba1c0c0e67323bbb12 Mon Sep 17 00:00:00 2001 +From: Tom Stellard +Date: Wed, 5 Sep 2018 21:43:42 -0700 +Subject: [PATCH] Don't prefer python2.7 + +--- + CMakeLists.txt | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 52b8819..6f233fd 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -109,7 +109,6 @@ if( CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR ) + set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} ) + + if(LLVM_INCLUDE_TESTS) +- set(Python_ADDITIONAL_VERSIONS 2.7) + include(FindPythonInterp) + if(NOT PYTHONINTERP_FOUND) + message(FATAL_ERROR +-- +1.8.3.1 + diff --git a/0001-Driver-Prefer-vendor-supplied-gcc-toolchain.patch b/0001-Driver-Prefer-vendor-supplied-gcc-toolchain.patch new file mode 100644 index 0000000..b9d0aee --- /dev/null +++ b/0001-Driver-Prefer-vendor-supplied-gcc-toolchain.patch @@ -0,0 +1,120 @@ +From d84a971ba917569829b51fff6057e5fd0d85e402 Mon Sep 17 00:00:00 2001 +From: Tom Stellard +Date: Thu, 18 Jan 2018 02:57:51 +0000 +Subject: [PATCH] Driver: Prefer vendor supplied gcc toolchain + +Summary: +This patch fixes an issue on Fedora where if you had the x86_64 cross +compiler installed on your x86_64 system, then clang would use that compiler +as the default toolchain. This was happening because the cross compiler +is installed to /usr/lib/gcc/x86_64-linux-gnu/ and this directory comes before +the default compiler directory (/usr/lib/gcc/x86_64-redhat-linux/) in the search +list. + +This patch re-orders the search list so that vendor supplied gcc toolchains +are selected before toolchains with a generic target, which should prevent +these kind of issues on other OSes too. + +Subscribers: srhines, cfe-commits + +Differential Revision: https://reviews.llvm.org/D42608 +--- + lib/Driver/ToolChains/Gnu.cpp | 47 ++++++++++++++++++++++--------------------- + 1 file changed, 24 insertions(+), 23 deletions(-) + +diff --git a/lib/Driver/ToolChains/Gnu.cpp b/lib/Driver/ToolChains/Gnu.cpp +index 3755673..5a49a6e 100644 +--- a/lib/Driver/ToolChains/Gnu.cpp ++++ b/lib/Driver/ToolChains/Gnu.cpp +@@ -1811,18 +1811,19 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes( + // lifetime or initialization issues. + static const char *const AArch64LibDirs[] = {"/lib64", "/lib"}; + static const char *const AArch64Triples[] = { +- "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-redhat-linux", +- "aarch64-suse-linux"}; ++ "aarch64-redhat-linux", "aarch64-suse-linux", ++ "aarch64-none-linux-gnu", "aarch64-linux-gnu"}; + static const char *const AArch64beLibDirs[] = {"/lib"}; + static const char *const AArch64beTriples[] = {"aarch64_be-none-linux-gnu", + "aarch64_be-linux-gnu"}; + + static const char *const ARMLibDirs[] = {"/lib"}; + static const char *const ARMTriples[] = {"arm-linux-gnueabi"}; +- static const char *const ARMHFTriples[] = {"arm-linux-gnueabihf", +- "armv7hl-redhat-linux-gnueabi", ++ static const char *const ARMHFTriples[] = {"armv7hl-redhat-linux-gnueabi", + "armv6hl-suse-linux-gnueabi", +- "armv7hl-suse-linux-gnueabi"}; ++ "armv7hl-suse-linux-gnueabi", ++ "arm-linux-gnueabihf", ++ }; + static const char *const ARMebLibDirs[] = {"/lib"}; + static const char *const ARMebTriples[] = {"armeb-linux-gnueabi"}; + static const char *const ARMebHFTriples[] = { +@@ -1830,19 +1831,19 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes( + + static const char *const X86_64LibDirs[] = {"/lib64", "/lib"}; + static const char *const X86_64Triples[] = { +- "x86_64-linux-gnu", "x86_64-unknown-linux-gnu", +- "x86_64-pc-linux-gnu", "x86_64-redhat-linux6E", +- "x86_64-redhat-linux", "x86_64-suse-linux", +- "x86_64-manbo-linux-gnu", "x86_64-linux-gnu", +- "x86_64-slackware-linux", "x86_64-unknown-linux", +- "x86_64-amazon-linux"}; ++ "x86_64-redhat-linux6E", "x86_64-redhat-linux", ++ "x86_64-suse-linux", "x86_64-slackware-linux", ++ "x86_64-manbo-linux-gnu", "x86_64-amazon-linux", ++ "x86_64-linux-gnu", "x86_64-unknown-linux-gnu", ++ "x86_64-pc-linux-gnu", "x86_64-linux-gnu", ++ "x86_64-unknown-linux"}; + static const char *const X32LibDirs[] = {"/libx32"}; + static const char *const X86LibDirs[] = {"/lib32", "/lib"}; + static const char *const X86Triples[] = { +- "i686-linux-gnu", "i686-pc-linux-gnu", "i486-linux-gnu", +- "i386-linux-gnu", "i386-redhat-linux6E", "i686-redhat-linux", +- "i586-redhat-linux", "i386-redhat-linux", "i586-suse-linux", +- "i486-slackware-linux", "i686-montavista-linux", "i586-linux-gnu"}; ++ "i386-redhat-linux6E", "i686-redhat-linux", "i586-redhat-linux", ++ "i386-redhat-linux", "i586-suse-linux", "i486-slackware-linux", ++ "i686-montavista-linux", "i686-linux-gnu", "i686-pc-linux-gnu", ++ "i486-linux-gnu", "i386-linux-gnu", "i586-linux-gnu"}; + + static const char *const MIPSLibDirs[] = {"/lib"}; + static const char *const MIPSTriples[] = {"mips-linux-gnu", "mips-mti-linux", +@@ -1864,16 +1865,16 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes( + + static const char *const PPCLibDirs[] = {"/lib32", "/lib"}; + static const char *const PPCTriples[] = { +- "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe", +- "powerpc-suse-linux", "powerpc-montavista-linuxspe"}; ++ "powerpc-suse-linux", "powerpc-montavista-linuxspe", ++ "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe"}; + static const char *const PPC64LibDirs[] = {"/lib64", "/lib"}; + static const char *const PPC64Triples[] = { +- "powerpc64-linux-gnu", "powerpc64-unknown-linux-gnu", +- "powerpc64-suse-linux", "ppc64-redhat-linux"}; ++ "powerpc64-suse-linux", "ppc64-redhat-linux", ++ "powerpc64-linux-gnu", "powerpc64-unknown-linux-gnu"}; + static const char *const PPC64LELibDirs[] = {"/lib64", "/lib"}; + static const char *const PPC64LETriples[] = { +- "powerpc64le-linux-gnu", "powerpc64le-unknown-linux-gnu", +- "powerpc64le-suse-linux", "ppc64le-redhat-linux"}; ++ "powerpc64le-suse-linux", "ppc64le-redhat-linux", ++ "powerpc64le-linux-gnu", "powerpc64le-unknown-linux-gnu"}; + + static const char *const RISCV32LibDirs[] = {"/lib", "/lib32"}; + static const char *const RISCVTriples[] = {"riscv32-unknown-linux-gnu", +@@ -1889,8 +1890,8 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes( + + static const char *const SystemZLibDirs[] = {"/lib64", "/lib"}; + static const char *const SystemZTriples[] = { +- "s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu", +- "s390x-suse-linux", "s390x-redhat-linux"}; ++ "s390x-ibm-linux-gnu", "s390x-suse-linux", "s390x-redhat-linux", ++ "s390x-linux-gnu", "s390x-unknown-linux-gnu"}; + + + using std::begin; +-- +1.8.3.1 + diff --git a/0001-Fix-uninitialized-value-in-ABIArgInfo.patch b/0001-Fix-uninitialized-value-in-ABIArgInfo.patch new file mode 100644 index 0000000..9755200 --- /dev/null +++ b/0001-Fix-uninitialized-value-in-ABIArgInfo.patch @@ -0,0 +1,38 @@ +From 565b9633ee68b311c1a954022869d9e99fee7286 Mon Sep 17 00:00:00 2001 +From: serge-sans-paille +Date: Fri, 1 Feb 2019 06:39:13 +0000 +Subject: [PATCH] Fix uninitialized value in ABIArgInfo + +GCC-9 takes advantage of this uninitialized values to optimize stuff, +which ends up in failing validation when compiling clang. +--- + include/clang/CodeGen/CGFunctionInfo.h | 11 +++++------ + 1 file changed, 5 insertions(+), 6 deletions(-) + +diff --git a/include/clang/CodeGen/CGFunctionInfo.h b/include/clang/CodeGen/CGFunctionInfo.h +index cf64e9f3ee..131eb38393 100644 +--- a/include/clang/CodeGen/CGFunctionInfo.h ++++ b/include/clang/CodeGen/CGFunctionInfo.h +@@ -112,14 +112,13 @@ private: + } + + ABIArgInfo(Kind K) +- : TheKind(K), PaddingInReg(false), InReg(false), SuppressSRet(false) { +- } ++ : TypeData(nullptr), PaddingType(nullptr), DirectOffset(0), ++ TheKind(K), PaddingInReg(false), InAllocaSRet(false), IndirectByVal(false), ++ IndirectRealign(false), SRetAfterThis(false), InReg(false), ++ CanBeFlattened(false), SignExt(false), SuppressSRet(false) {} + + public: +- ABIArgInfo() +- : TypeData(nullptr), PaddingType(nullptr), DirectOffset(0), +- TheKind(Direct), PaddingInReg(false), InReg(false), +- SuppressSRet(false) {} ++ ABIArgInfo() : ABIArgInfo(Direct) {} + + static ABIArgInfo getDirect(llvm::Type *T = nullptr, unsigned Offset = 0, + llvm::Type *Padding = nullptr, +-- +2.19.2 + diff --git a/0001-Workaround-GCC-9-bug-when-handling-bitfields.patch b/0001-Workaround-GCC-9-bug-when-handling-bitfields.patch new file mode 100644 index 0000000..eee6d3a --- /dev/null +++ b/0001-Workaround-GCC-9-bug-when-handling-bitfields.patch @@ -0,0 +1,25 @@ +From 201cacaa74446657d884786d31411a98f6f9c17e Mon Sep 17 00:00:00 2001 +From: serge-sans-paille +Date: Mon, 4 Feb 2019 21:25:45 +0000 +Subject: [PATCH] Workaround GCC 9 bug when handling bitfields. + +--- + include/clang/Frontend/TextDiagnosticPrinter.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/include/clang/Frontend/TextDiagnosticPrinter.h b/include/clang/Frontend/TextDiagnosticPrinter.h +index 3cb4e02edf..d47d71930c 100644 +--- a/include/clang/Frontend/TextDiagnosticPrinter.h ++++ b/include/clang/Frontend/TextDiagnosticPrinter.h +@@ -35,7 +35,7 @@ class TextDiagnosticPrinter : public DiagnosticConsumer { + /// A string to prefix to error messages. + std::string Prefix; + +- unsigned OwnsOutputStream : 1; ++ bool OwnsOutputStream; + + public: + TextDiagnosticPrinter(raw_ostream &os, DiagnosticOptions *diags, +-- +2.19.2 + diff --git a/0001-gtest-reorg.patch b/0001-gtest-reorg.patch new file mode 100644 index 0000000..4d8693a --- /dev/null +++ b/0001-gtest-reorg.patch @@ -0,0 +1,42 @@ +From 3b2afecc227d652f84f883d4018d43971de6a311 Mon Sep 17 00:00:00 2001 +From: Tom Stellard +Date: Wed, 21 Mar 2018 07:17:00 -0700 +Subject: [PATCH] gtest reorg + +--- + CMakeLists.txt | 12 +++++------- + 1 file changed, 5 insertions(+), 7 deletions(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 2eee8e6..01d290f 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -142,12 +142,6 @@ Please install Python or specify the PYTHON_EXECUTABLE CMake variable.") + set(LLVM_UTILS_PROVIDED ON) + set(CLANG_TEST_DEPS FileCheck count not) + endif() +- set(UNITTEST_DIR ${LLVM_MAIN_SRC_DIR}/utils/unittest) +- if(EXISTS ${UNITTEST_DIR}/googletest/include/gtest/gtest.h +- AND NOT EXISTS ${LLVM_LIBRARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}gtest${CMAKE_STATIC_LIBRARY_SUFFIX} +- AND EXISTS ${UNITTEST_DIR}/CMakeLists.txt) +- add_subdirectory(${UNITTEST_DIR} utils/unittest) +- endif() + else() + # Seek installed Lit. + find_program(LLVM_LIT +@@ -477,7 +471,11 @@ endif() + + + if( CLANG_INCLUDE_TESTS ) +- if(EXISTS ${LLVM_MAIN_SRC_DIR}/utils/unittest/googletest/include/gtest/gtest.h) ++ set(UNITTEST_DIR ${LLVM_MAIN_SRC_DIR}/utils/unittest) ++ if(EXISTS ${UNITTEST_DIR}/googletest/include/gtest/gtest.h ++ AND NOT EXISTS ${LLVM_LIBRARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}gtest${CMAKE_STATIC_LIBRARY_SUFFIX} ++ AND EXISTS ${UNITTEST_DIR}/CMakeLists.txt) ++ add_subdirectory(${UNITTEST_DIR} utils/unittest) + add_subdirectory(unittests) + list(APPEND CLANG_TEST_DEPS ClangUnitTests) + list(APPEND CLANG_TEST_PARAMS +-- +1.8.3.1 + diff --git a/0001-lit.cfg-Add-hack-so-lit-can-find-not-and-FileCheck.patch b/0001-lit.cfg-Add-hack-so-lit-can-find-not-and-FileCheck.patch new file mode 100644 index 0000000..508434d --- /dev/null +++ b/0001-lit.cfg-Add-hack-so-lit-can-find-not-and-FileCheck.patch @@ -0,0 +1,27 @@ +From 06cde370a44393d65bae7f61279900b5838b4a2c Mon Sep 17 00:00:00 2001 +From: Tom Stellard +Date: Tue, 23 Jan 2018 18:59:20 -0800 +Subject: [PATCH] lit.cfg: Add hack so lit can find not and FileCheck + +--- + test/lit.cfg.py | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/test/lit.cfg.py b/test/lit.cfg.py +index 5323cfe..5b4184e 100644 +--- a/test/lit.cfg.py ++++ b/test/lit.cfg.py +@@ -39,7 +39,10 @@ config.test_source_root = os.path.dirname(__file__) + # test_exec_root: The root path where tests should be run. + config.test_exec_root = os.path.join(config.clang_obj_root, 'test') + ++old_llvm_tools_dir = llvm_config.config.llvm_tools_dir ++llvm_config.config.llvm_tools_dir = '/usr/lib@FEDORA_LLVM_LIB_SUFFIX@/llvm' + llvm_config.use_default_substitutions() ++llvm_config.config.llvm_tools_dir = old_llvm_tools_dir + + llvm_config.use_clang() + +-- +1.8.3.1 + diff --git a/0001-lit.cfg-Remove-substitutions-for-clang-llvm-tools.patch b/0001-lit.cfg-Remove-substitutions-for-clang-llvm-tools.patch new file mode 100644 index 0000000..a0ed70d --- /dev/null +++ b/0001-lit.cfg-Remove-substitutions-for-clang-llvm-tools.patch @@ -0,0 +1,73 @@ +From c4d409e8481e402eb34739c6579bd9ffe383f3cd Mon Sep 17 00:00:00 2001 +From: Tom Stellard +Date: Fri, 16 Jun 2017 00:48:27 +0000 +Subject: [PATCH] lit.cfg: Remove substitutions for clang/llvm tools + +We were missing some subsitutions, for example 'not with no pipe, so +there was a mismatch where some tests would run tools using the full +path and others would search PATH for the tool. + +The new beahavior is that the lit tests will always search PATH for the +tool. This should not change the current functionality, because the +smae paths that were being used in substitutions are being added to +PATH. +--- + test/lit.cfg | 42 ------------------------------------------ + 1 file changed, 42 deletions(-) + +diff --git a/test/lit.cfg b/test/lit.cfg +index 7d8bebf..9ded96c 100644 +--- a/test/lit.cfg ++++ b/test/lit.cfg +@@ -303,48 +303,6 @@ config.substitutions.append( + (' %clang-cl ', + """*** invalid substitution, use '%clang_cl'. ***""") ) + +-# For each occurrence of a clang tool name as its own word, replace it +-# with the full path to the build directory holding that tool. This +-# ensures that we are testing the tools just built and not some random +-# tools that might happen to be in the user's PATH. +-tool_dirs = os.path.pathsep.join((clang_tools_dir, llvm_tools_dir)) +- +-# Regex assertions to reject neighbor hyphens/dots (seen in some tests). +-# For example, don't match 'clang-check-' or '.clang-format'. +-NoPreHyphenDot = r"(? 7 +%bcond_without python3 +%else +%bcond_with python3 +%endif + +%global clang_srcdir cfe-%{version}%{?rc_ver:rc%{rc_ver}}.src +%global clang_tools_srcdir clang-tools-extra-%{version}%{?rc_ver:rc%{rc_ver}}.src + +Name: %pkg_name +Version: %{maj_ver}.%{min_ver}.%{patch_ver} +Release: 7%{?rc_ver:.rc%{rc_ver}}%{?dist} +Summary: A C language family front-end for LLVM + +License: NCSA +URL: http://llvm.org +Source0: http://%{?rc_ver:pre}releases.llvm.org/%{version}/%{?rc_ver:rc%{rc_ver}}/%{clang_srcdir}.tar.xz +%if !0%{?compat_build} +Source1: http://%{?rc_ver:pre}releases.llvm.org/%{version}/%{?rc_ver:rc%{rc_ver}}/%{clang_tools_srcdir}.tar.xz +%endif + +Patch0: 0001-lit.cfg-Add-hack-so-lit-can-find-not-and-FileCheck.patch +Patch2: 0001-Driver-Prefer-vendor-supplied-gcc-toolchain.patch +Patch4: 0001-gtest-reorg.patch +Patch5: 0001-Don-t-prefer-python2.7.patch +Patch6: 0001-Convert-clang-format-diff.py-to-python3-using-2to3.patch +Patch7: 0001-Convert-scan-view-to-python3-using-2to3.patch +#rhbz#1657544 +Patch8: 0001-CodeGen-Handle-mixed-width-ops-in-mixed-sign-mul-wit.patch +Patch9: 0001-Fix-uninitialized-value-in-ABIArgInfo.patch +Patch10: 0001-Workaround-GCC-9-bug-when-handling-bitfields.patch + +# clang-tools-extra patches +Patch100: 0001-Convert-run-find-all-symbols.py-to-python3-using-2to.patch + +BuildRequires: gcc +BuildRequires: gcc-c++ +BuildRequires: cmake +%if 0%{?compat_build} +BuildRequires: llvm%{maj_ver}.%{min_ver}-devel = %{version} +BuildRequires: llvm%{maj_ver}.%{min_ver}-static = %{version} +%else +BuildRequires: llvm-devel = %{version} +# llvm-static is required, because clang-tablegen needs libLLVMTableGen, which +# is not included in libLLVM.so. +BuildRequires: llvm-static = %{version} +BuildRequires: llvm-googletest = %{version} +%endif + +BuildRequires: libxml2-devel +BuildRequires: perl-generators +BuildRequires: ncurses-devel +# According to https://fedoraproject.org/wiki/Packaging:Emacs a package +# should BuildRequires: emacs if it packages emacs integration files. +BuildRequires: emacs + +# These build dependencies are required for the test suite. +%if %with python3 +# The testsuite uses /usr/bin/lit which is part of the python3-lit package. +BuildRequires: python3-lit +%endif + +BuildRequires: python2-rpm-macros +BuildRequires: python3-sphinx +BuildRequires: libatomic + +# We need python3-devel for pathfix.py. +BuildRequires: python3-devel + +# Needed for %%multilib_fix_c_header +BuildRequires: multilib-rpm-config + +Requires: %{name}-libs%{?_isa} = %{version}-%{release} + +# clang requires gcc, clang++ requires libstdc++-devel +# - https://bugzilla.redhat.com/show_bug.cgi?id=1021645 +# - https://bugzilla.redhat.com/show_bug.cgi?id=1158594 +Requires: libstdc++-devel +Requires: gcc-c++ + +Requires: emacs-filesystem + +Provides: clang(major) = %{maj_ver} + +%description +clang: noun + 1. A loud, resonant, metallic sound. + 2. The strident call of a crane or goose. + 3. C-language family front-end toolkit. + +The goal of the Clang project is to create a new C, C++, Objective C +and Objective C++ front-end for the LLVM compiler. Its tools are built +as libraries and designed to be loosely-coupled and extensible. + +%package libs +Summary: Runtime library for clang +Recommends: compiler-rt%{?_isa} = %{version} +Recommends: libomp%{_isa} = %{version} + +%description libs +Runtime library for clang. + +%package devel +Summary: Development header files for clang +Requires: %{name}%{?_isa} = %{version}-%{release} +# The clang CMake files reference tools from clang-tools-extra. +Requires: %{name}-tools-extra%{?_isa} = %{version}-%{release} + +%description devel +Development header files for clang. + +%if !0%{?compat_build} +%package analyzer +Summary: A source code analysis framework +License: NCSA and MIT +BuildArch: noarch +Requires: %{name} = %{version}-%{release} + +%description analyzer +The Clang Static Analyzer consists of both a source code analysis +framework and a standalone tool that finds bugs in C and Objective-C +programs. The standalone tool is invoked from the command-line, and is +intended to run in tandem with a build of a project or code base. + +%package tools-extra +Summary: Extra tools for clang +Requires: %{name}-libs%{?_isa} = %{version}-%{release} +Requires: emacs-filesystem + +%description tools-extra +A set of extra tools built using Clang's tooling API. + +# Put git-clang-format in its own package, because it Requires git and python2 +# and we don't want to force users to install all those dependenices if they +# just want clang. +%package -n git-clang-format +Summary: Integration of clang-format for git +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: git +Requires: python2 + +%description -n git-clang-format +clang-format integration for git. + +%package -n python2-clang +Summary: Python2 bindings for clang +Requires: %{name}-libs%{?_isa} = %{version}-%{release} +Requires: python2 +%description -n python2-clang +%{summary}. + +%endif + + +%prep +%if 0%{?compat_build} +%autosetup -n %{clang_srcdir} -p1 +%else +%setup -T -q -b 1 -n %{clang_tools_srcdir} + +%patch100 -p1 -b .find-all-symbols-py3 + +pathfix.py -i %{__python3} -pn \ + clang-tidy/tool/*.py \ + include-fixer/find-all-symbols/tool/run-find-all-symbols.py + +%setup -q -n %{clang_srcdir} + +%patch0 -p1 -b .lit-search-path +%patch2 -p1 -b .vendor-gcc +%patch4 -p1 -b .gtest +%patch5 -p1 -b .no-python2 +%patch6 -p1 -b .clang-format-diff-py3 +%patch7 -p1 -b .scan-view-py3 +%patch8 -p1 -b .mul-overflow-fix +%patch9 -p1 -b .abi-arginfo + +mv ../%{clang_tools_srcdir} tools/extra + +pathfix.py -i %{__python3} -pn \ + tools/clang-format/*.py \ + tools/clang-format/git-clang-format \ + utils/hmaptool/hmaptool \ + tools/scan-view/bin/scan-view +%endif + +%build + +%if 0%{?__isa_bits} == 64 +sed -i 's/\@FEDORA_LLVM_LIB_SUFFIX\@/64/g' test/lit.cfg.py +%else +sed -i 's/\@FEDORA_LLVM_LIB_SUFFIX\@//g' test/lit.cfg.py +%endif + +mkdir -p _build +cd _build + +%ifarch %{arm} +# Decrease debuginfo verbosity to reduce memory consumption during final library linking +%global optflags %(echo %{optflags} | sed 's/-g /-g1 /') +%endif + +%cmake .. \ + -DLLVM_LINK_LLVM_DYLIB:BOOL=ON \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DPYTHON_EXECUTABLE=%{__python3} \ +%if 0%{?compat_build} + -DLLVM_CONFIG:FILEPATH=%{_bindir}/llvm-config-%{maj_ver}.%{min_ver}-%{__isa_bits} \ + -DCMAKE_INSTALL_PREFIX=%{install_prefix} \ + -DCLANG_INCLUDE_TESTS:BOOL=OFF \ +%else + -DLLVM_CONFIG:FILEPATH=/usr/bin/llvm-config-%{__isa_bits} \ + -DCLANG_INCLUDE_TESTS:BOOL=ON \ + -DLLVM_EXTERNAL_LIT=%{_bindir}/lit \ + -DLLVM_MAIN_SRC_DIR=%{_datadir}/llvm/src \ +%if 0%{?__isa_bits} == 64 + -DLLVM_LIBDIR_SUFFIX=64 \ +%else + -DLLVM_LIBDIR_SUFFIX= \ +%endif +%endif + \ + -DCLANG_ENABLE_ARCMT:BOOL=ON \ + -DCLANG_ENABLE_STATIC_ANALYZER:BOOL=ON \ + -DCLANG_INCLUDE_DOCS:BOOL=ON \ + -DCLANG_PLUGIN_SUPPORT:BOOL=ON \ + -DENABLE_LINKER_BUILD_ID:BOOL=ON \ + -DLLVM_ENABLE_EH=ON \ + -DLLVM_ENABLE_RTTI=ON \ + -DLLVM_BUILD_DOCS=ON \ + -DLLVM_ENABLE_SPHINX=ON \ + -DSPHINX_WARNINGS_AS_ERRORS=OFF \ + \ + -DCLANG_BUILD_EXAMPLES:BOOL=OFF \ + -DCLANG_REPOSITORY_STRING="%{?fedora:Fedora}%{?rhel:Red Hat} %{version}-%{release}" \ + -DLIB_SUFFIX= + +make %{?_smp_mflags} + +%install +make install DESTDIR=%{buildroot} -C _build + +%if 0%{?compat_build} + +# Remove binaries/other files +rm -Rf %{buildroot}%{install_bindir} +rm -Rf %{buildroot}%{install_prefix}/share +rm -Rf %{buildroot}%{install_prefix}/libexec + +# Move include files +mkdir -p %{buildroot}%{pkg_includedir} +mv %{buildroot}/%{install_includedir}/clang %{buildroot}/%{pkg_includedir}/ +mv %{buildroot}/%{install_includedir}/clang-c %{buildroot}/%{pkg_includedir}/ + +%else + +# install clang python bindings +mkdir -p %{buildroot}%{python2_sitelib}/clang/ +install -p -m644 bindings/python/clang/* %{buildroot}%{python2_sitelib}/clang/ + +# multilib fix +%multilib_fix_c_header --file %{_includedir}/clang/Config/config.h + +# Move emacs integration files to the correct directory +mkdir -p %{buildroot}%{_emacs_sitestartdir} +for f in clang-format.el clang-rename.el clang-include-fixer.el; do +mv %{buildroot}{%{_datadir}/clang,%{_emacs_sitestartdir}}/$f +done + +# remove editor integrations (bbedit, sublime, emacs, vim) +rm -vf %{buildroot}%{_datadir}/clang/clang-format-bbedit.applescript +rm -vf %{buildroot}%{_datadir}/clang/clang-format-sublime.py* + +# TODO: Package html docs +rm -Rvf %{buildroot}%{_pkgdocdir} + +# TODO: What are the Fedora guidelines for packaging bash autocomplete files? +rm -vf %{buildroot}%{_datadir}/clang/bash-autocomplete.sh + +# Add clang++-{version} sylink +ln -s clang++ %{buildroot}%{_bindir}/clang++-%{maj_ver} + +# Create Manpage symlinks +ln -s clang.1.gz %{buildroot}%{_mandir}/man1/clang++.1.gz +ln -s clang.1.gz %{buildroot}%{_mandir}/man1/clang-%{maj_ver}.1.gz +ln -s clang.1.gz %{buildroot}%{_mandir}/man1/clang++-%{maj_ver}.1.gz + +# Fix permission +chmod u-x %{buildroot}%{_mandir}/man1/scan-build.1* + +%endif + +%check +%if !0%{?compat_build} +# requires lit.py from LLVM utilities +cd _build +# FIXME: Fix failing ARM tests +PATH=%{_libdir}/llvm:$PATH make %{?_smp_mflags} check-all || \ +%ifarch %{arm} +: +%else +false +%endif + +%endif + + +%if !0%{?compat_build} +%files +%{clang_binaries} +%{_bindir}/c-index-test +%{_mandir}/man1/clang.1.gz +%{_mandir}/man1/clang++.1.gz +%{_mandir}/man1/clang-%{maj_ver}.1.gz +%{_mandir}/man1/clang++-%{maj_ver}.1.gz +%{_mandir}/man1/diagtool.1.gz +%{_emacs_sitestartdir}/clang-format.el +%{_datadir}/clang/clang-format.py* +%{_datadir}/clang/clang-format-diff.py* +%endif + +%files libs +%if !0%{?compat_build} +%{_libdir}/clang/ +%{_libdir}/*.so.* +%else +%{pkg_libdir}/*.so.* +%{pkg_libdir}/clang/%{version} +%endif + +%files devel +%if !0%{?compat_build} +%{_libdir}/*.so +%{_includedir}/clang/ +%{_includedir}/clang-c/ +%{_libdir}/cmake/* +%dir %{_datadir}/clang/ +%else +%{pkg_libdir}/*.so +%{pkg_includedir}/clang/ +%{pkg_includedir}/clang-c/ +%{pkg_libdir}/cmake/ +%endif + +%if !0%{?compat_build} +%files analyzer +%{_bindir}/scan-view +%{_bindir}/scan-build +%{_bindir}/scan-build +%{_libexecdir}/ccc-analyzer +%{_libexecdir}/c++-analyzer +%{_datadir}/scan-view/ +%{_datadir}/scan-build/ +%{_mandir}/man1/scan-build.1.* + +%files tools-extra +%{clang_tools_binaries} +%{_bindir}/find-all-symbols +%{_bindir}/modularize +%{_emacs_sitestartdir}/clang-rename.el +%{_emacs_sitestartdir}/clang-include-fixer.el +%{_datadir}/clang/clang-include-fixer.py* +%{_datadir}/clang/clang-tidy-diff.py* +%{_datadir}/clang/run-clang-tidy.py* +%{_datadir}/clang/run-find-all-symbols.py* +%{_datadir}/clang/clang-rename.py* + +%files -n git-clang-format +%{_bindir}/git-clang-format + +%files -n python2-clang +%{python2_sitelib}/clang/ + +%endif +%changelog +* Mon Feb 18 2019 sguelton@redhat.com - 7.0.1-7 +- Sync specfile with llvm7.0 package + +* Tue Feb 05 2019 sguelton@redhat.com - 7.0.1-6 +- Update patch for Python3 port of scan-view + +* Tue Feb 05 2019 sguelton@redhat.com - 7.0.1-5 +- Working CI test suite + +* Mon Feb 04 2019 sguelton@redhat.com - 7.0.1-4 +- Workaround gcc-9 bug when compiling bitfields + +* Fri Feb 01 2019 sguelton@redhat.com - 7.0.1-3 +- Fix uninitialized error detected by gcc-9 + +* Thu Jan 31 2019 Fedora Release Engineering - 7.0.1-2.1 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Wed Dec 19 2018 Tom Stellard - 7.0.1-2 +- Fix for rhbz#1657544 + +* Tue Dec 18 2018 sguelton@redhat.com - 7.0.1-1 +- 7.0.1 + +* Tue Dec 18 2018 sguelton@redhat.com - 7.0.0-10 +- Install proper manpage symlinks for clang/clang++ versions + +* Fri Dec 14 2018 sguelton@redhat.com - 7.0.0-9 +- No longer Ignore -fstack-clash-protection option + +* Tue Dec 04 2018 sguelton@redhat.com - 7.0.0-8 +- Ensure rpmlint passes on specfile + +* Fri Nov 30 2018 Tom Stellard - 7.0.0-7 +- Drop python2 dependency from clang-tools-extra + +* Wed Nov 21 2018 sguelton@redhat.com - 7.0.0-6 +- Prune unneeded reference to llvm-test-suite sub-package + +* Mon Nov 19 2018 Tom Stellard - 7.0.0-5 +- Run 'make check-all' instead of 'make check-clang' + +* Mon Nov 19 2018 sergesanspaille - 7.0.0-4 +- Avoid Python2 + Python3 dependency for clang-analyzer + +* Mon Nov 05 2018 Tom Stellard - 7.0.0-3 +- User helper macro to fixup config.h for multilib + +* Tue Oct 02 2018 Tom Stellard - 7.0.0-2 +- Use correct shebang substitution for python scripts + +* Mon Sep 24 2018 Tom Stellard - 7.0.0-1 +- 7.0.0 Release + +* Wed Sep 19 2018 Tom Stellard - 7.0.0-0.16.rc3 +- Move builtin headers into clang-libs sub-package + +* Wed Sep 19 2018 Tom Stellard - 7.0.0-0.15.rc3 +- Remove ambiguous python shebangs + +* Thu Sep 13 2018 Tom Stellard - 7.0.0-0.14.rc3 +- Move unversioned shared objects to devel package + +* Thu Sep 13 2018 Tom Stellard - 7.0.0-0.13.rc3 +- Rebuild with new llvm-devel that disables rpath on install + +* Thu Sep 13 2018 Tom Stellard - 7.0.0-0.12.rc3 +- Fix clang++-7 symlink + +* Wed Sep 12 2018 Tom Stellard - 7.0.0-0.11.rc3 +- 7.0.0-rc3 Release + +* Mon Sep 10 2018 Tom Stellard - 7.0.0-0.10.rc2 +- Drop siod from llvm-test-suite + +* Fri Sep 07 2018 Tom Stellard - 7.0.0-0.9.rc2 +- Drop python2 dependency from clang package + +* Thu Sep 06 2018 Tom Stellard - 7.0.0-0.8.rc2 +- Drop all uses of python2 from lit tests + +* Sat Sep 01 2018 Tom Stellard - 7.0.0-0.7.rc2 +- Add Fedora specific version string + +* Tue Aug 28 2018 Tom Stellard - 7.0.0-0.6.rc2 +- 7.0.0-rc2 Release + +* Tue Aug 28 2018 Tom Stellard - 7.0.0-0.5.rc1 +- Enable unit tests + +* Fri Aug 17 2018 Tom Stellard - 7.0.0-0.4.rc1 +- Move llvm-test-suite into a sub-package + +* Fri Aug 17 2018 Tom Stellard - 7.0.0-0.3.rc1 +- Recommend the same version of compiler-rt + +* Wed Aug 15 2018 Tom Stellard - 7.0.0-0.2.rc1 +- Rebuild for f30 + +* Mon Aug 13 2018 Tom Stellard - 7.0.0-0.1.rc1 +- 7.0.0-rc1 Release + +* Mon Jul 23 2018 Tom Stellard - 6.0.1-3 +- Sync spec file with the clang6.0 package + +* Thu Jul 12 2018 Fedora Release Engineering - 6.0.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Tue Jun 26 2018 Tom Stellard - 6.0.1-1 +- 6.0.1 Release + +* Wed Jun 13 2018 Tom Stellard - 6.0.1-0.2.rc2 +- 6.0.1-rc2 + +* Fri May 11 2018 Tom Stellard - 6.0.1-0.1.rc1 +- 6.0.1-rc1 Release + +* Fri Mar 23 2018 Tom Stellard - 6.0.0-5 +- Add a clang++-{version} symlink rhbz#1534098 + +* Thu Mar 22 2018 Tom Stellard - 6.0.0-4 +- Use correct script for running lit tests + +* Wed Mar 21 2018 Tom Stellard - 6.0.0-3 +- Fix toolchain detection so we don't default to using cross-compilers: + rhbz#1482491 + +* Mon Mar 12 2018 Tom Stellard - 6.0.0-2 +- Add Provides: clang(major) rhbz#1547444 + +* Fri Mar 09 2018 Tom Stellard - 6.0.0-1 +- 6.0.0 Release + +* Mon Feb 12 2018 Tom Stellard - 6.0.0-0.6.rc2 +- 6.0.0-rc2 Release + +* Wed Feb 07 2018 Fedora Release Engineering - 6.0.0-0.5.rc1 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Thu Feb 01 2018 Tom Stellard - 6.0.0-0.4.rc1 +- Package python helper scripts for tools + +* Fri Jan 26 2018 Tom Stellard - 6.0.0-0.3.rc1 +- Ignore -fstack-clash-protection option instead of giving an error + +* Fri Jan 26 2018 Tom Stellard - 6.0.0-0.2.rc1 +- Package emacs integration files + +* Wed Jan 24 2018 Tom Stellard - 6.0.0-0.1.rc1 +- 6.0.0-rc1 Release + +* Wed Jan 24 2018 Tom Stellard - 5.0.1-3 +- Rebuild against llvm5.0 compatibility package +- rhbz#1538231 + +* Wed Jan 03 2018 Iryna Shcherbina - 5.0.1-2 +- Update Python 2 dependency declarations to new packaging standards + (See https://fedoraproject.org/wiki/FinalizingFedoraSwitchtoPython3) + +* Wed Dec 20 2017 Tom Stellard - 5.0.1-1 +- 5.0.1 Release + +* Wed Dec 13 2017 Tom Stellard - 5.0.0-3 +- Make compiler-rt a weak dependency and add a weak dependency on libomp + +* Mon Nov 06 2017 Merlin Mathesius - 5.0.0-2 +- Cleanup spec file conditionals + +* Mon Oct 16 2017 Tom Stellard - 5.0.0-1 +- 5.0.0 Release + +* Wed Oct 04 2017 Rex Dieter - 4.0.1-6 +- python2-clang subpkg (#1490997) +- tools-extras: tighten (internal) -libs dep +- %%install: avoid cd + +* Wed Aug 30 2017 Tom Stellard - 4.0.1-5 +- Add Requires: python for git-clang-format + +* Sun Aug 06 2017 Björn Esser - 4.0.1-4 +- Rebuilt for AutoReq cmake-filesystem + +* Wed Aug 02 2017 Fedora Release Engineering - 4.0.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Wed Jul 26 2017 Fedora Release Engineering - 4.0.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Fri Jun 23 2017 Tom Stellard - 4.0.1-1 +- 4.0.1 Release. + +* Fri Jun 16 2017 Tom Stellard - 4.0.0-8 +- Enable make check-clang + +* Mon Jun 12 2017 Tom Stellard - 4.0.0-7 +- Package git-clang-format + +* Thu Jun 08 2017 Tom Stellard - 4.0.0-6 +- Generate man pages + +* Thu Jun 08 2017 Tom Stellard - 4.0.0-5 +- Ignore test-suite failures until all arches are fixed. + +* Mon Apr 03 2017 Tom Stellard - 4.0.0-4 +- Run llvm test-suite + +* Mon Mar 27 2017 Tom Stellard - 4.0.0-3 +- Enable eh/rtti, which are required by lldb. + +* Fri Mar 24 2017 Tom Stellard - 4.0.0-2 +- Fix clang-tools-extra build +- Fix install + +* Thu Mar 23 2017 Tom Stellard - 4.0.0-1 +- clang 4.0.0 final release + +* Mon Mar 20 2017 David Goerger - 3.9.1-3 +- add clang-tools-extra rhbz#1328091 + +* Thu Mar 16 2017 Tom Stellard - 3.9.1-2 +- Enable build-id by default rhbz#1432403 + +* Thu Mar 02 2017 Dave Airlie - 3.9.1-1 +- clang 3.9.1 final release + +* Fri Feb 10 2017 Fedora Release Engineering - 3.9.0-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Mon Nov 14 2016 Nathaniel McCallum - 3.9.0-3 +- Add Requires: compiler-rt to clang-libs. +- Without this, compiling with certain CFLAGS breaks. + +* Tue Nov 1 2016 Peter Robinson 3.9.0-2 +- Rebuild for new arches + +* Fri Oct 14 2016 Dave Airlie - 3.9.0-1 +- clang 3.9.0 final release + +* Fri Jul 01 2016 Stephan Bergmann - 3.8.0-2 +- Resolves: rhbz#1282645 add GCC abi_tag support + +* Thu Mar 10 2016 Dave Airlie 3.8.0-1 +- clang 3.8.0 final release + +* Thu Mar 03 2016 Dave Airlie 3.8.0-0.4 +- clang 3.8.0rc3 + +* Wed Feb 24 2016 Dave Airlie - 3.8.0-0.3 +- package all libs into clang-libs. + +* Wed Feb 24 2016 Dave Airlie 3.8.0-0.2 +- enable dynamic linking of clang against llvm + +* Thu Feb 18 2016 Dave Airlie - 3.8.0-0.1 +- clang 3.8.0rc2 + +* Fri Feb 12 2016 Dave Airlie 3.7.1-4 +- rebuild against latest llvm packages +- add BuildRequires llvm-static + +* Wed Feb 03 2016 Fedora Release Engineering - 3.7.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Thu Jan 28 2016 Dave Airlie 3.7.1-2 +- just accept clang includes moving to /usr/lib64, upstream don't let much else happen + +* Thu Jan 28 2016 Dave Airlie 3.7.1-1 +- initial build in Fedora. + +* Tue Oct 06 2015 Jan Vcelak 3.7.0-100 +- initial version using cmake build system diff --git a/sources b/sources new file mode 100644 index 0000000..110ceb3 --- /dev/null +++ b/sources @@ -0,0 +1 @@ +SHA512 (cfe-7.0.1.src.tar.xz) = df2f38153ebdc261bcfa6a569567f759bbb1a803192882a9d4eca55a47878166ac9057151a94ad341dc1281136547e4faa783a68070dfde2307b48cacd4b9194