tbb-commits
Threads by month
- ----- 2026 -----
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- 1 participants
- 20240 discussions
10 Feb '20
commit af17fda1a457cf3ec5845318556defd0d29272d7
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Mon Feb 10 02:31:45 2020 +0000
Changelog update and build3
Fix reproducibility issue in macOS build.
---
projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt | 2 ++
rbm.conf | 2 +-
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt b/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
index c576cdf..c542ef0 100644
--- a/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
+++ b/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
@@ -12,6 +12,8 @@ Tor Browser 9.0.5 -- February 11 2020
* Build System
* All Platforms
* Bug 32739: Bump clang to 8.0.1
+ * OS X
+ * Bug 33200: Fix permissions on bookmarks.html
Tor Browser 9.0.4 -- January 9 2020
* All Platforms
diff --git a/rbm.conf b/rbm.conf
index 5e43719..123d1a8 100644
--- a/rbm.conf
+++ b/rbm.conf
@@ -25,7 +25,7 @@ buildconf:
var:
torbrowser_version: '9.0.5'
- torbrowser_build: 'build2'
+ torbrowser_build: 'build3'
torbrowser_incremental_from:
- 9.0.4
project_name: tor-browser
1
0
[tor-browser-build/maint-9.0] Bug 33200: Fix permissions on bookmarks.html
by sysrqb@torproject.org 10 Feb '20
by sysrqb@torproject.org 10 Feb '20
10 Feb '20
commit 16c72c7040e51364f497ec2ed8a597b6874d080d
Author: Nicolas Vigier <boklm(a)torproject.org>
Date: Sun Feb 9 23:50:01 2020 +0100
Bug 33200: Fix permissions on bookmarks.html
Fix a build reproducibility issue caused by different permissions on
bookmarks.html.
---
projects/tor-browser/build | 1 +
1 file changed, 1 insertion(+)
diff --git a/projects/tor-browser/build b/projects/tor-browser/build
index cf31331..bcd2412 100644
--- a/projects/tor-browser/build
+++ b/projects/tor-browser/build
@@ -147,6 +147,7 @@ cp defaults/preferences/000-tor-browser.js $rootdir
mkdir -p chrome/en-US/locale/browser
cp -p $rootdir/bookmarks.html chrome/en-US/locale/browser/
[% c("var/touch") %] chrome/en-US/locale/browser/bookmarks.html
+ chmod 600 chrome/en-US/locale/browser/bookmarks.html
zip -Xm omni.ja chrome/en-US/locale/browser/bookmarks.html
rm -rf chrome
[% END %]
1
0
commit dc0898ee7a84678ef324e08d29f5722e8c83572a
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Thu Feb 6 23:37:23 2020 +0000
Translations update
---
src/chrome/locale/ja/network-settings.dtd | 2 +-
src/chrome/locale/ka/network-settings.dtd | 2 +-
src/chrome/locale/nb-NO/network-settings.dtd | 6 +-
src/chrome/locale/nl/torlauncher.properties | 2 +-
src/chrome/locale/pt-PT/network-settings.dtd | 6 +-
src/chrome/locale/pt-PT/torlauncher.properties | 2 +-
src/chrome/locale/ru/network-settings.dtd | 18 ++---
src/chrome/locale/vi/network-settings.dtd | 42 +++++-----
src/chrome/locale/vi/torlauncher.properties | 106 ++++++++++++-------------
src/chrome/locale/zh-CN/network-settings.dtd | 14 ++--
10 files changed, 100 insertions(+), 100 deletions(-)
diff --git a/src/chrome/locale/ja/network-settings.dtd b/src/chrome/locale/ja/network-settings.dtd
index 2d2dce7..f52bf18 100644
--- a/src/chrome/locale/ja/network-settings.dtd
+++ b/src/chrome/locale/ja/network-settings.dtd
@@ -66,7 +66,7 @@
<!ENTITY torPreferences.torSettings "Tor の設定">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser は通信トラフィックを Tor ネットワークを経由させて送信します。Tor ネットワークは世界中の何千ものボランティアによって運用されています。" >
<!ENTITY torPreferences.learnMore "詳細情報">
-<!ENTITY torPreferences.bridges "ブリッジ">
+<!ENTITY torPreferences.bridges "Bridge">
<!ENTITY torPreferences.bridgesDescription "ブリッジは Tor がブロックされる地域から Tor ネットワークにアクセスすることを手助けします。地域によって、あるブリッジが他のものよりうまく動作する可能性があります。">
<!ENTITY torPreferences.useBridge "ブリッジを使用する">
<!ENTITY torPreferences.requestNewBridge "新しいブリッジを要求…">
diff --git a/src/chrome/locale/ka/network-settings.dtd b/src/chrome/locale/ka/network-settings.dtd
index 82ae5ad..737e74f 100644
--- a/src/chrome/locale/ka/network-settings.dtd
+++ b/src/chrome/locale/ka/network-settings.dtd
@@ -79,5 +79,5 @@
<!ENTITY torPreferences.requestBridgeDialogSolvePrompt "გაიარეთ CAPTCHA, გადამცემი ხიდის მოთხოვნისთვის.">
<!ENTITY torPreferences.requestBridgeErrorBadSolution "გადაწყვეტა არასწორია. გთხოვთ სცადოთ ხელახლა.">
<!ENTITY torPreferences.viewTorLogs "იხილეთ Tor-ის ჩანაწერები.">
-<!ENTITY torPreferences.viewLogs "იხილეთ ჩანაწერები...">
+<!ENTITY torPreferences.viewLogs "ჩანაწერების ნახვა...">
<!ENTITY torPreferences.torLogsDialogTitle "Tor-ის ჩანაწერები">
diff --git a/src/chrome/locale/nb-NO/network-settings.dtd b/src/chrome/locale/nb-NO/network-settings.dtd
index 2254760..f2e0547 100644
--- a/src/chrome/locale/nb-NO/network-settings.dtd
+++ b/src/chrome/locale/nb-NO/network-settings.dtd
@@ -28,7 +28,7 @@
<!ENTITY torsettings.useProxy.checkbox "Jeg bruker en mellomtjener for å koble til Internett">
<!ENTITY torsettings.useProxy.type "Mellomtjeningstype">
<!ENTITY torsettings.useProxy.type.placeholder "velg en mellomtjenertype">
-<!ENTITY torsettings.useProxy.address "Address">
+<!ENTITY torsettings.useProxy.address " Adresse">
<!ENTITY torsettings.useProxy.address.placeholder "IP-adresse, eller vertsnavn">
<!ENTITY torsettings.useProxy.port "Port">
<!ENTITY torsettings.useProxy.username "Brukernavn">
@@ -72,10 +72,10 @@
<!ENTITY torPreferences.requestNewBridge "Forespør ny bro…">
<!ENTITY torPreferences.provideBridge "Provide a bridge">
<!ENTITY torPreferences.advanced "Avansert">
-<!ENTITY torPreferences.advancedDescription "Configure how Tor Browser connects to the internet.">
+<!ENTITY torPreferences.advancedDescription "Konfigurer hvordan Tor Browser kobles til internett.">
<!ENTITY torPreferences.firewallPortsPlaceholder "Comma-separated values">
<!ENTITY torPreferences.requestBridgeDialogTitle "Forespør en bro">
-<!ENTITY torPreferences.requestBridgeDialogWaitPrompt "Contacting BridgeDB. Please Wait.">
+<!ENTITY torPreferences.requestBridgeDialogWaitPrompt "Kontakter BridgeDB. Vennligst vent.">
<!ENTITY torPreferences.requestBridgeDialogSolvePrompt "Løs CAPTCHA-en for å forespørre en bro.">
<!ENTITY torPreferences.requestBridgeErrorBadSolution "Løsningen er ikke riktig. Vær så snill, prøv på nytt.">
<!ENTITY torPreferences.viewTorLogs "Se Tor-loggene.">
diff --git a/src/chrome/locale/nl/torlauncher.properties b/src/chrome/locale/nl/torlauncher.properties
index c5c7518..e77ca7b 100644
--- a/src/chrome/locale/nl/torlauncher.properties
+++ b/src/chrome/locale/nl/torlauncher.properties
@@ -29,7 +29,7 @@ torlauncher.error_default_bridges_type_missing=U moet een transporttype selecter
torlauncher.error_bridgedb_bridges_missing=Vraag een bridge aan.
torlauncher.error_bridge_bad_default_type=Er zijn geen verstrekte bridges met het transporttype %S beschikbaar. Pas uw instellingen aan.
-torlauncher.bridge_suffix.meek-amazon=(Werkt in China)
+torlauncher.bridge_suffix.meek-amazon=(werkt in China)
torlauncher.bridge_suffix.meek-azure=(werkt in China)
torlauncher.request_a_bridge=Een bridge aanvragen…
diff --git a/src/chrome/locale/pt-PT/network-settings.dtd b/src/chrome/locale/pt-PT/network-settings.dtd
index c67eda7..529ee3e 100644
--- a/src/chrome/locale/pt-PT/network-settings.dtd
+++ b/src/chrome/locale/pt-PT/network-settings.dtd
@@ -26,18 +26,18 @@
<!ENTITY torsettings.optional "Opcional">
<!ENTITY torsettings.useProxy.checkbox "Eu utilizo um proxy para ligar à Internet">
-<!ENTITY torsettings.useProxy.type "Tipo de proxy">
+<!ENTITY torsettings.useProxy.type "Tipo de Proxy">
<!ENTITY torsettings.useProxy.type.placeholder "selecionar um tipo de proxy">
<!ENTITY torsettings.useProxy.address "Morada">
<!ENTITY torsettings.useProxy.address.placeholder "Endereço de IP ou nome do hospedeiro">
<!ENTITY torsettings.useProxy.port "Porta">
-<!ENTITY torsettings.useProxy.username "nome de utilizador">
+<!ENTITY torsettings.useProxy.username "Nome de utilizador">
<!ENTITY torsettings.useProxy.password "Palavra-passe">
<!ENTITY torsettings.useProxy.type.socks4 "SOCKS 4">
<!ENTITY torsettings.useProxy.type.socks5 "SOCKS 5">
<!ENTITY torsettings.useProxy.type.http "HTTP / HTTPS">
<!ENTITY torsettings.firewall.checkbox "Este computador liga através de uma firewall que só permite ligações para determinadas portas">
-<!ENTITY torsettings.firewall.allowedPorts "Portas permitidas">
+<!ENTITY torsettings.firewall.allowedPorts "Portas Permitidas">
<!ENTITY torsettings.useBridges.checkbox "O Tor é censurado no meu país">
<!ENTITY torsettings.useBridges.default "Selecionar uma ponte integrada">
<!ENTITY torsettings.useBridges.default.placeholder "selecionar uma ponte">
diff --git a/src/chrome/locale/pt-PT/torlauncher.properties b/src/chrome/locale/pt-PT/torlauncher.properties
index 36e225e..459dfbc 100644
--- a/src/chrome/locale/pt-PT/torlauncher.properties
+++ b/src/chrome/locale/pt-PT/torlauncher.properties
@@ -15,7 +15,7 @@ torlauncher.tor_bootstrap_failed_details=%1$S falhou (%2$S).
torlauncher.unable_to_start_tor=Não é possível iniciar o Tor.\n\n %S
torlauncher.tor_missing=O executável do Tor está em falta.
torlauncher.torrc_missing=O ficheiro torrc está em falta e não foi possível criá-lo.
-torlauncher.datadir_missing=O diretório de dados do Tor não existe e não foi possível criá-lo.
+torlauncher.datadir_missing=A diretoria de dados do Tor não existe e não foi possível criá-la.
torlauncher.password_hash_missing=Não foi possível obter a palavra-passe "hashed".
torlauncher.failed_to_get_settings=Não é possível obter as definições do Tor\n\n %S
diff --git a/src/chrome/locale/ru/network-settings.dtd b/src/chrome/locale/ru/network-settings.dtd
index 5e950b0..03e4f61 100644
--- a/src/chrome/locale/ru/network-settings.dtd
+++ b/src/chrome/locale/ru/network-settings.dtd
@@ -36,8 +36,8 @@
<!ENTITY torsettings.useProxy.type.socks4 "SOCKS 4">
<!ENTITY torsettings.useProxy.type.socks5 "SOCKS 5">
<!ENTITY torsettings.useProxy.type.http "HTTP / HTTPS">
-<!ENTITY torsettings.firewall.checkbox "Мой сетевой экран позволяет мне подключиться только к определённым портам">
-<!ENTITY torsettings.firewall.allowedPorts "Разрешённые порты">
+<!ENTITY torsettings.firewall.checkbox "Мой брандмауэр разрешает подключения только к определенным портам">
+<!ENTITY torsettings.firewall.allowedPorts "Разрешенные порты">
<!ENTITY torsettings.useBridges.checkbox "Tor запрещён в моей стране">
<!ENTITY torsettings.useBridges.default "Выбрать встроенный мост">
<!ENTITY torsettings.useBridges.default.placeholder "выбор моста">
@@ -47,7 +47,7 @@
<!ENTITY torsettings.useBridges.captchaSubmit "Передать">
<!ENTITY torsettings.useBridges.custom "Указать мост, который я знаю">
<!ENTITY torsettings.useBridges.label "Введите информацию о мосте от доверенного источника.">
-<!ENTITY torsettings.useBridges.placeholder "введите адрес:порт (по одному в строке)">
+<!ENTITY torsettings.useBridges.placeholder "адрес:порт (по одному в строке)">
<!ENTITY torsettings.copyLog "Скопировать журнал Tor в буфер обмена">
@@ -64,13 +64,13 @@
<!-- #31286 about:preferences strings -->
<!ENTITY torPreferences.categoryTitle "Tor">
<!ENTITY torPreferences.torSettings "Настройки Tor">
-<!ENTITY torPreferences.torSettingsDescription "Tor Browser перенаправляет ваш трафик через сеть Tor, управляемую тысячами добровольцев по всему миру." >
+<!ENTITY torPreferences.torSettingsDescription "Tor Browser перенаправляет ваш трафик через сеть Tor. Ее поддерживают тысячи добровольцев по всему миру." >
<!ENTITY torPreferences.learnMore "Подробнее">
<!ENTITY torPreferences.bridges "Мосты">
-<!ENTITY torPreferences.bridgesDescription "Мосты помогают получить доступ к сети Tor в местах, где он заблокирован. В зависимости от места, где вы находитесь, один мост может работать лучше другого.">
+<!ENTITY torPreferences.bridgesDescription "Мосты помогают получить доступ к сети Tor там, где он заблокирован. В зависимости от вашего местонахождения один мост может работать лучше другого.">
<!ENTITY torPreferences.useBridge "Использовать мост">
<!ENTITY torPreferences.requestNewBridge "Запрос нового моста…">
-<!ENTITY torPreferences.provideBridge "Предоставить мост">
+<!ENTITY torPreferences.provideBridge "Указать свой мост">
<!ENTITY torPreferences.advanced "Дополнительно">
<!ENTITY torPreferences.advancedDescription "Настройка подключения Tor Browser к интернету.">
<!ENTITY torPreferences.firewallPortsPlaceholder "Значения, разделённые запятыми">
@@ -78,6 +78,6 @@
<!ENTITY torPreferences.requestBridgeDialogWaitPrompt "Обращение к BridgeDB. Пожалуйста, подождите.">
<!ENTITY torPreferences.requestBridgeDialogSolvePrompt "Решите CAPTCHA для запроса моста.">
<!ENTITY torPreferences.requestBridgeErrorBadSolution "Решение не является правильным. Попробуйте ещё раз.">
-<!ENTITY torPreferences.viewTorLogs "Просмотр журналов Tor.">
-<!ENTITY torPreferences.viewLogs "Просмотр журналов…">
-<!ENTITY torPreferences.torLogsDialogTitle "Журналы Tor">
+<!ENTITY torPreferences.viewTorLogs "Просмотр журнала Tor">
+<!ENTITY torPreferences.viewLogs "Просмотр журнала…">
+<!ENTITY torPreferences.torLogsDialogTitle "Журнал Tor">
diff --git a/src/chrome/locale/vi/network-settings.dtd b/src/chrome/locale/vi/network-settings.dtd
index 9ecc5d9..aa31765 100644
--- a/src/chrome/locale/vi/network-settings.dtd
+++ b/src/chrome/locale/vi/network-settings.dtd
@@ -26,7 +26,7 @@
<!ENTITY torsettings.optional "Tuỳ chọn">
<!ENTITY torsettings.useProxy.checkbox "Tôi sử dụng proxy để kết nối tới Internet">
-<!ENTITY torsettings.useProxy.type "Proxy Type">
+<!ENTITY torsettings.useProxy.type "Loại proxy">
<!ENTITY torsettings.useProxy.type.placeholder "chọn loại proxy">
<!ENTITY torsettings.useProxy.address "Địa chỉ nhà">
<!ENTITY torsettings.useProxy.address.placeholder "Địa chỉ IP hoặc hostname">
@@ -37,7 +37,7 @@
<!ENTITY torsettings.useProxy.type.socks5 "SOCK 5">
<!ENTITY torsettings.useProxy.type.http "HTTP / HTTPS">
<!ENTITY torsettings.firewall.checkbox "Máy tính này đi qua một tường lửa mà chỉ cho phép tới một vài cổng">
-<!ENTITY torsettings.firewall.allowedPorts "Allowed Ports">
+<!ENTITY torsettings.firewall.allowedPorts "Cổng được cho phép">
<!ENTITY torsettings.useBridges.checkbox "Tor đã bị kiểm duyệt ở quốc gia của tôi">
<!ENTITY torsettings.useBridges.default "Sử dụng cầu nối có sẵn">
<!ENTITY torsettings.useBridges.default.placeholder "chọn loại cầu nối">
@@ -52,32 +52,32 @@
<!ENTITY torsettings.copyLog "Chép nhật ký của Tor vào Clipboard">
<!ENTITY torsettings.proxyHelpTitle "Trợ giúp proxy">
-<!ENTITY torsettings.proxyHelp1 "A local proxy might be needed when connecting through a company, school, or university network. If you are not sure whether a proxy is needed, look at the Internet settings in another browser or check your system's network settings.">
+<!ENTITY torsettings.proxyHelp1 "Proxy cục bộ có thể cần thiết khi kết nối qua mạng ở công ty hay trường học. Nếu bạn không chắc rằng có cần dùng proxy hay không, xem cài đặt Internet ở một trình duyệt khác hoặc kiểm tra cài đặt Internet của hệ thống.">
<!ENTITY torsettings.bridgeHelpTitle "Giúp đỡ về Tiếp sức cầu nối">
-<!ENTITY torsettings.bridgeHelp1 "Bridges are unlisted relays that make it more difficult to block connections to the Tor Network.  Each type of bridge uses a different method to avoid censorship.  The obfs ones make your traffic look like random noise, and the meek ones make your traffic look like it's connecting to that service instead of Tor.">
-<!ENTITY torsettings.bridgeHelp2 "Because of how certain countries try to block Tor, certain bridges work in certain countries but not others.  If you are unsure about which bridges work in your country, visit torproject.org/about/contact.html#support">
+<!ENTITY torsettings.bridgeHelp1 "Cầu nối là những rơle không công khai giúp kết nối tới mạng Tor khó bị chặn hơn.  Mỗi loại cầu nối sử dụng một phương thức khác nhau để tránh kiểm duyệt.  Cầu nối obfs khiến lưu lượng của bạn trông như ngẫu nhiên, còn cầu nối meek khiến lưu lượng của bạn trông như đang kết nối tới dịch vụ đó thay vì Tor.">
+<!ENTITY torsettings.bridgeHelp2 "Vì một vài quốc gia chặn Tor theo những cách khác nhau, cầu nối này có thể hoạt động ở quốc gia này nhưng không được ở quốc gia khác.  Nếu bạn không chắc cầu nối nào hoạt động ở quốc gia bạn, hãy truy cập torproject.org/about/contact.html#support">
<!-- Progress -->
<!ENTITY torprogress.pleaseWait "Vui lòng chờ trong khi chúng tôi thiết lập kết nối tới mạng lưới Tor.  Việc này có thể mất một vài phút.">
<!-- #31286 about:preferences strings -->
<!ENTITY torPreferences.categoryTitle "Tor">
-<!ENTITY torPreferences.torSettings "Tor Settings">
-<!ENTITY torPreferences.torSettingsDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world." >
-<!ENTITY torPreferences.learnMore "Learn More">
+<!ENTITY torPreferences.torSettings "Cài đặt Tor">
+<!ENTITY torPreferences.torSettingsDescription "Tor Browser dẫn lưu lượng của bạn qua mạng Tor, vận hành bởi hàng ngàn tình nguyện viên khắp thế giới." >
+<!ENTITY torPreferences.learnMore "Tìm hiểu thêm">
<!ENTITY torPreferences.bridges "Cầu Nối">
-<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
-<!ENTITY torPreferences.useBridge "Use a bridge">
-<!ENTITY torPreferences.requestNewBridge "Request a New Bridge…">
-<!ENTITY torPreferences.provideBridge "Provide a bridge">
+<!ENTITY torPreferences.bridgesDescription "Cầu nối giúp bạn truy cập mạng Tor ở những nơi mạng Tor bị chặn. Tùy vào vị trí của bạn mà một cầu nối có thể hoạt động tốt hơn cầu nối khác.">
+<!ENTITY torPreferences.useBridge "Dùng cầu nối">
+<!ENTITY torPreferences.requestNewBridge "Yêu cầu Cầu nối mới...">
+<!ENTITY torPreferences.provideBridge "Cung cấp cầu nối">
<!ENTITY torPreferences.advanced "Nâng cao">
-<!ENTITY torPreferences.advancedDescription "Configure how Tor Browser connects to the internet.">
-<!ENTITY torPreferences.firewallPortsPlaceholder "Comma-separated values">
-<!ENTITY torPreferences.requestBridgeDialogTitle "Request Bridge">
-<!ENTITY torPreferences.requestBridgeDialogWaitPrompt "Contacting BridgeDB. Please Wait.">
-<!ENTITY torPreferences.requestBridgeDialogSolvePrompt "Solve the CAPTCHA to request a bridge.">
-<!ENTITY torPreferences.requestBridgeErrorBadSolution "The solution is not correct. Please try again.">
-<!ENTITY torPreferences.viewTorLogs "View the Tor logs.">
-<!ENTITY torPreferences.viewLogs "View Logs…">
-<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
+<!ENTITY torPreferences.advancedDescription "Cài đặt cách Tor Browser kết nối tới internet.">
+<!ENTITY torPreferences.firewallPortsPlaceholder "Giá trị ngăn cách bởi dấu phẩy">
+<!ENTITY torPreferences.requestBridgeDialogTitle "Yêu cầu cầu nối">
+<!ENTITY torPreferences.requestBridgeDialogWaitPrompt "Đang kết nối tới BridgeDB. Vui lòng đợi.">
+<!ENTITY torPreferences.requestBridgeDialogSolvePrompt "Giải mã CAPTCHA để yêu cầu cầu nối.">
+<!ENTITY torPreferences.requestBridgeErrorBadSolution "Kết quả không đúng. Vui lòng thử lại.">
+<!ENTITY torPreferences.viewTorLogs "Xem nhật kí Tor.">
+<!ENTITY torPreferences.viewLogs "Xem nhật kí...">
+<!ENTITY torPreferences.torLogsDialogTitle "Nhật kí Tor">
diff --git a/src/chrome/locale/vi/torlauncher.properties b/src/chrome/locale/vi/torlauncher.properties
index f2e19d1..cb6ed17 100644
--- a/src/chrome/locale/vi/torlauncher.properties
+++ b/src/chrome/locale/vi/torlauncher.properties
@@ -3,7 +3,7 @@
torlauncher.error_title=Trình khởi chạy Tor
-torlauncher.tor_exited_during_startup=Tor đã thoát trong khi khởi động. Điều này có lẽ là do một lỗi trong tệp tin torrc của bạn, một khiếm khuyết của Tor hay của một chương trình khác trong hệ thống của bạn, hoặc lỗi phần cứng. Cho đến khi bạn sửa chữa lại vấn đề bên dưới đó và khởi động lại Tor, trình duyệt Tor sẽ không khởi động.
+torlauncher.tor_exited_during_startup=Tor đã thoát trong khi khởi động. Điều này có lẽ là do lỗi trong tập tin torrc của bạn, lỗi của Tor hay một chương trình khác trong hệ thống của bạn, hoặc lỗi phần cứng. Cho đến khi bạn sửa chữa lại vấn đề đó và khởi động lại Tor, trình duyệt Tor sẽ không khởi động.
torlauncher.tor_exited=Tor đã tắt một cách không mong muốn. Việc này có thể do lỗi trong bản thân Tor, một chương trình khác trong hệ thống của bản, hoặc lỗi phần cứng. Cho tới khi bạn khởi động lại Tor, Trình duyệt Tor sẽ không thể truy cập tới bất kỳ trang nào. Nếu vấn đề vẫn tồn tại, vui lòng gửi một bản sao nhật ký của Tor tới nhóm hỗ trợ.
torlauncher.tor_exited2=Khởi động lại Tor sẽ không đóng hết những thẻ trình duyệt của bạn.
torlauncher.tor_controlconn_failed=Không thể kết nối với cổng kiểm soát của Tor.
@@ -14,7 +14,7 @@ torlauncher.tor_bootstrap_failed_details=%1$S đã thất bại (%2$S).
torlauncher.unable_to_start_tor=Không thể khởi động Tor.\n\n%S
torlauncher.tor_missing=Tập tin thực thi của Tor bị thiếu.
-torlauncher.torrc_missing=Tập tin torrc đang bị thiếu hoặc không thể tạo.
+torlauncher.torrc_missing=Tập tin torrc đang bị thiếu và không thể tạo.
torlauncher.datadir_missing=Thư mục dữ liệu của Tor không tồn tại và không thể tạo.
torlauncher.password_hash_missing=Thất bại khi lấy mật khẩu đã được băm.
@@ -22,73 +22,73 @@ torlauncher.failed_to_get_settings=Không thể nhận được cài đặt Tor.
torlauncher.failed_to_save_settings=Không thể lưu lại các cài đặt của Tor.
torlauncher.ensure_tor_is_running=Hãy chắc chắn rằng Tor đang chạy.
-torlauncher.error_proxy_addr_missing=Bạn phải xác định cả hai một địa chỉ IP hay tên máy và số cổng để cấu hình Tor để sử dụng một proxy ủy quyền truy cập vào Liên mạng
+torlauncher.error_proxy_addr_missing=Bạn phải xác định cả địa chỉ IP hoặc hostname và số cổng để cấu hình Tor sử dụng một proxy để truy cập Internet.
torlauncher.error_proxy_type_missing=Bạn phải chọn kiểu proxy.
-torlauncher.error_bridges_missing=Bạn phải chỉ dẫn một hoặc nhiều cầu nối.
-torlauncher.error_default_bridges_type_missing=Bạn phải chọn một loại vận chuyển cho cầu nối đã được cung cấp.
-torlauncher.error_bridgedb_bridges_missing=Please request a bridge.
+torlauncher.error_bridges_missing=Bạn phải chọn một hoặc nhiều cầu nối.
+torlauncher.error_default_bridges_type_missing=Bạn phải chọn một hình thức vận chuyển cho cầu nối đã được cung cấp.
+torlauncher.error_bridgedb_bridges_missing=Vui lòng yêu cầu cầu nối
torlauncher.error_bridge_bad_default_type=Không cầu nối đã được cung cấp nào có loại vận chuyển %S có sẵn. Vui lòng điều chỉnh cài đặt của bạn.
-torlauncher.bridge_suffix.meek-amazon=(works in China)
-torlauncher.bridge_suffix.meek-azure=(works in China)
+torlauncher.bridge_suffix.meek-amazon=(hoạt động ở Trung Quốc)
+torlauncher.bridge_suffix.meek-azure=(hoạt động ở Trung Quốc)
-torlauncher.request_a_bridge=Request a Bridge…
-torlauncher.request_a_new_bridge=Request a New Bridge…
-torlauncher.contacting_bridgedb=Contacting BridgeDB. Please wait.
-torlauncher.captcha_prompt=Solve the CAPTCHA to request a bridge.
-torlauncher.bad_captcha_solution=The solution is not correct. Please try again.
-torlauncher.unable_to_get_bridge=Unable to obtain a bridge from BridgeDB.\n\n%S
+torlauncher.request_a_bridge=Yêu cầu Cầu nối...
+torlauncher.request_a_new_bridge=Yêu cầu Cầu nối mới...
+torlauncher.contacting_bridgedb=Đang kết nối tới BridgeDB. Vui lòng đợi.
+torlauncher.captcha_prompt=Giải mã CAPTCHA để yêu cầu cầu nối.
+torlauncher.bad_captcha_solution=Kết quả không đúng. Vui lòng thử lại.
+torlauncher.unable_to_get_bridge=Không thể nhận cầu nối từ BridgeDB.\n\n%S
torlauncher.no_meek=This browser is not configured for meek, which is needed to obtain bridges.
-torlauncher.no_bridges_available=No bridges are available at this time. Sorry.
+torlauncher.no_bridges_available=Không có cầu nối khả dụng lúc này. Xin lỗi.
torlauncher.connect=Kết nối
torlauncher.restart_tor=Khởi động lại Tor
torlauncher.quit=Thoát
torlauncher.quit_win=Thoát
-torlauncher.done=Hoàn thành
+torlauncher.done=Xong
torlauncher.forAssistance=Để được trợ giúp, liên hệ %S
torlauncher.forAssistance2=Nếu cần sự giúp đỡ, ghé qua %S
-torlauncher.copiedNLogMessages=Sao chép hoàn tất. %S thông điệp nhật ký của Tor đã sẵn sàng để dán vào một chương trình sửa văn bản hoặc một thông điệp email.
+torlauncher.copiedNLogMessages=Sao chép hoàn tất. %S thông điệp nhật ký của Tor đã sẵn sàng để dán vào một chương trình sửa văn bản hoặc một email.
-torlauncher.bootstrapStatus.starting=Bắt đầu
-torlauncher.bootstrapStatus.conn_pt=Connecting to bridge
-torlauncher.bootstrapStatus.conn_done_pt=Connected to bridge
-torlauncher.bootstrapStatus.conn_proxy=Connecting to proxy
-torlauncher.bootstrapStatus.conn_done_proxy=Connected to proxy
-torlauncher.bootstrapStatus.conn=Connecting to a Tor relay
-torlauncher.bootstrapStatus.conn_done=Connected to a Tor relay
-torlauncher.bootstrapStatus.handshake=Negotiating with a Tor relay
-torlauncher.bootstrapStatus.handshake_done=Finished negotiating with a Tor relay
-torlauncher.bootstrapStatus.onehop_create=Thành lập một kết nối thư mục được mã hóa
-torlauncher.bootstrapStatus.requesting_status=Khôi phục trạng thái mạng
-torlauncher.bootstrapStatus.loading_status=Nap tình trạng mạng
-torlauncher.bootstrapStatus.loading_keys=Nạp giấy chứng nhận quyền
-torlauncher.bootstrapStatus.requesting_descriptors=Yêu cầu thông tin tiếp sức
-torlauncher.bootstrapStatus.loading_descriptors=Tải thông tin tiếp sức
-torlauncher.bootstrapStatus.enough_dirinfo=Finished loading relay information
-torlauncher.bootstrapStatus.ap_conn_pt=Building circuits: Connecting to bridge
-torlauncher.bootstrapStatus.ap_conn_done_pt=Building circuits: Connected to bridge
-torlauncher.bootstrapStatus.ap_conn_proxy=Building circuits: Connecting to proxy
-torlauncher.bootstrapStatus.ap_conn_done_proxy=Building circuits: Connected to proxy
-torlauncher.bootstrapStatus.ap_conn=Building circuits: Connecting to a Tor relay
-torlauncher.bootstrapStatus.ap_conn_done=Building circuits: Connected to a Tor relay
-torlauncher.bootstrapStatus.ap_handshake=Building circuits: Negotiating with a Tor relay
-torlauncher.bootstrapStatus.ap_handshake_done=Building circuits: Finished negotiating with a Tor relay
-torlauncher.bootstrapStatus.circuit_create=Building circuits: Establishing a Tor circuit
-torlauncher.bootstrapStatus.done=Kết nối với mạng Tor!
+torlauncher.bootstrapStatus.starting=Đang khởi động
+torlauncher.bootstrapStatus.conn_pt=Đang kết nối tới cầu nối
+torlauncher.bootstrapStatus.conn_done_pt=Đã kết nối tới cầu nối
+torlauncher.bootstrapStatus.conn_proxy=Đang kết nối tới proxy
+torlauncher.bootstrapStatus.conn_done_proxy=Đã kết nối tới proxy
+torlauncher.bootstrapStatus.conn=Đang kết nối tới một rơle Tor
+torlauncher.bootstrapStatus.conn_done=Đã kết nối tới một rơle Tor
+torlauncher.bootstrapStatus.handshake=Đang đàm phán với một rơle Tor
+torlauncher.bootstrapStatus.handshake_done=Đã đàm phán với một rơle Tor
+torlauncher.bootstrapStatus.onehop_create=Đang thiết lập một kết nối danh mục được mã hóa
+torlauncher.bootstrapStatus.requesting_status=Đang nhận trạng thái mạng
+torlauncher.bootstrapStatus.loading_status=Đang tải trạng thái mạng
+torlauncher.bootstrapStatus.loading_keys=Đang tải chứng nhận quyền
+torlauncher.bootstrapStatus.requesting_descriptors=Đang yêu cầu thông tin rơle
+torlauncher.bootstrapStatus.loading_descriptors=Đang tải thông tin rơle
+torlauncher.bootstrapStatus.enough_dirinfo=Đã tải thông tin rơle
+torlauncher.bootstrapStatus.ap_conn_pt=Đang xây dựng mạch: Đang kết nối tới cầu nối
+torlauncher.bootstrapStatus.ap_conn_done_pt=Đang xây dựng mạch: Đã kết nối tới cầu nối
+torlauncher.bootstrapStatus.ap_conn_proxy=Đang xây dựng mạch: Đang kết nối tới proxy
+torlauncher.bootstrapStatus.ap_conn_done_proxy=Đang xây dựng mạch: Đã kết nối tới proxy
+torlauncher.bootstrapStatus.ap_conn=Đang xây dựng mạch: Đang kết nối tới một rơle Tor
+torlauncher.bootstrapStatus.ap_conn_done=Đang xây dựng mạch: Đã kết nối tới một rơle Tor
+torlauncher.bootstrapStatus.ap_handshake=Đang xây dựng mạch: Đang đàm phán với một rơle Tor
+torlauncher.bootstrapStatus.ap_handshake_done=Đang xây dựng mạch: Đã đàm phán với một rơle Tor
+torlauncher.bootstrapStatus.circuit_create=Đang xây dựng mạch: Đang thiết lập mạch Tor
+torlauncher.bootstrapStatus.done=Đã kết nối tới mạng Tor!
-torlauncher.bootstrapWarning.done=làm xong
-torlauncher.bootstrapWarning.connectrefused=kết nối từ chối
-torlauncher.bootstrapWarning.misc=hỗn hợp
-torlauncher.bootstrapWarning.resourcelimit=không đủ nguồn lực
+torlauncher.bootstrapWarning.done=xong
+torlauncher.bootstrapWarning.connectrefused=kết nối đã bị từ chối
+torlauncher.bootstrapWarning.misc=bổ sung
+torlauncher.bootstrapWarning.resourcelimit=không đủ tài nguyên
torlauncher.bootstrapWarning.identity=danh tính không khớp
-torlauncher.bootstrapWarning.timeout=kết nối timeout
-torlauncher.bootstrapWarning.noroute=không có lộ trình để lưu trữ
+torlauncher.bootstrapWarning.timeout=kết nối đã timeout
+torlauncher.bootstrapWarning.noroute=không có lộ trình đến máy chủ
torlauncher.bootstrapWarning.ioerror=lỗi đọc / ghi
-torlauncher.bootstrapWarning.pt_missing=pluggable transport bị mất
+torlauncher.bootstrapWarning.pt_missing=thiếu pluggable transport
-torlauncher.nsresult.NS_ERROR_NET_RESET=The connection to the server was lost.
-torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Could not connect to the server.
-torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Could not connect to the proxy.
+torlauncher.nsresult.NS_ERROR_NET_RESET=Mất kết nối tới máy chủ.
+torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Không thể kết nối tới máy chủ.
+torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Không thể kết nối tới proxy.
diff --git a/src/chrome/locale/zh-CN/network-settings.dtd b/src/chrome/locale/zh-CN/network-settings.dtd
index 8c9bc74..53500ef 100644
--- a/src/chrome/locale/zh-CN/network-settings.dtd
+++ b/src/chrome/locale/zh-CN/network-settings.dtd
@@ -1,5 +1,5 @@
<!ENTITY torsettings.dialog.title "Tor 网络设置">
-<!ENTITY torsettings.wizard.title.default "已连接到 Tor 网络">
+<!ENTITY torsettings.wizard.title.default "连接 Tor 网络">
<!ENTITY torsettings.wizard.title.configure "Tor 网络设置">
<!ENTITY torsettings.wizard.title.connecting "正在建立连接">
@@ -9,8 +9,8 @@
<!-- For "first run" wizard: -->
-<!ENTITY torSettings.connectPrompt "请点击“连接”以连接至 Tor 网络。">
-<!ENTITY torSettings.configurePrompt "如果您所在的国家(如埃及,中国,土耳其)对 Tor 进行审查,或者您处于的私人网络需要代理,请点击“配置”,对网络设置进行调整。">
+<!ENTITY torSettings.connectPrompt "点击“连接”,连接 Tor 网络。">
+<!ENTITY torSettings.configurePrompt "如您所在国家(如埃及、中国、土耳其)对 Tor 进行审查,或者您的私人网络需要代理,请点击“配置”,调整网络设置。">
<!ENTITY torSettings.configure "配置">
<!ENTITY torSettings.connect "连接">
@@ -41,15 +41,15 @@
<!ENTITY torsettings.useBridges.checkbox "我所在的国家对 Tor 进行了审查">
<!ENTITY torsettings.useBridges.default "选择内置网桥">
<!ENTITY torsettings.useBridges.default.placeholder "选择网桥">
-<!ENTITY torsettings.useBridges.bridgeDB "从torproject.org获取一个网桥">
-<!ENTITY torsettings.useBridges.captchaSolution.placeholder "请输入图片中出现的字符">
+<!ENTITY torsettings.useBridges.bridgeDB "从 torproject.org 获取网桥">
+<!ENTITY torsettings.useBridges.captchaSolution.placeholder "请输入图中的字符">
<!ENTITY torsettings.useBridges.reloadCaptcha.tooltip "获取新的验证码">
<!ENTITY torsettings.useBridges.captchaSubmit "提交">
-<!ENTITY torsettings.useBridges.custom "输入获取的网桥">
+<!ENTITY torsettings.useBridges.custom "输入已获取网桥">
<!ENTITY torsettings.useBridges.label "输入可信来源提供的网桥:">
<!ENTITY torsettings.useBridges.placeholder "输入地址:端口(每行一个)">
-<!ENTITY torsettings.copyLog "点击复制 Tor 日志">
+<!ENTITY torsettings.copyLog "复制 Tor 日志">
<!ENTITY torsettings.proxyHelpTitle "代理帮助">
<!ENTITY torsettings.proxyHelp1 "通过公司,学校或大学的网络连接时可能需要本地代理。  如果您不确定是否需要代理,可查看其他浏览器中的网络设置或查看系统的网络设置。">
1
0
07 Feb '20
commit 3a38a607d4a5aabc8be29f9d57fa074cacc4c006
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Fri Feb 7 03:02:41 2020 +0000
Release preparations for 0.2.21.1
Version bump
---
src/install.rdf | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/install.rdf b/src/install.rdf
index fb35c37..78eef27 100644
--- a/src/install.rdf
+++ b/src/install.rdf
@@ -7,7 +7,7 @@
<em:creator>The Tor Project, Inc.</em:creator>
<em:contributor>Pearl Crescent, LLC</em:contributor>
<em:id>tor-launcher(a)torproject.org</em:id>
- <em:version>0.2.21</em:version>
+ <em:version>0.2.21.1</em:version>
<em:multiprocessCompatible>true</em:multiprocessCompatible>
<em:homepageURL>https://www.torproject.org/projects/torbrowser.html</em:homepageURL>
<em:updateURL>data:text/plain,</em:updateURL>
1
0
commit 76da9f6b962bf9a76f2d367ebfe315c3effe835e
Author: Georg Koppen <gk(a)torproject.org>
Date: Thu Dec 12 16:47:15 2019 +0000
Bump clang to 8.0.1
---
keyring/clang.gpg | Bin 7186 -> 2222 bytes
keyring/llvm.gpg | Bin 4309 -> 0 bytes
projects/clang/config | 14 +++++++-------
projects/mingw-w64-clang/config | 10 +++++-----
4 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/keyring/clang.gpg b/keyring/clang.gpg
index 15f0d8a..eba625c 100644
Binary files a/keyring/clang.gpg and b/keyring/clang.gpg differ
diff --git a/keyring/llvm.gpg b/keyring/llvm.gpg
deleted file mode 100644
index 7c7ab06..0000000
Binary files a/keyring/llvm.gpg and /dev/null differ
diff --git a/projects/clang/config b/projects/clang/config
index 59a9102..cf4dcb0 100644
--- a/projects/clang/config
+++ b/projects/clang/config
@@ -1,5 +1,5 @@
# vim: filetype=yaml sw=2
-version: 8.0.0
+version: 8.0.1
filename: '[% project %]-[% c("version") %]-[% c("var/build_id") %].tar.gz'
gpg_keyring: clang.gpg
sig_ext: sig
@@ -23,22 +23,22 @@ input_files:
enable: '[% c("var/linux") %]'
- project: cmake
name: cmake
- - URL: 'https://releases.llvm.org/[% c("version") %]/llvm-[% c("version") %].src.tar.xz'
+ - URL: 'https://github.com/llvm/llvm-project/releases/download/llvmorg-[% c("version") %]/llvm-[% c("version") %].src.tar.xz'
name: llvm
file_gpg_id: 1
- - URL: 'https://releases.llvm.org/[% c("version") %]/cfe-[% c("version") %].src.tar.xz'
+ - URL: 'https://github.com/llvm/llvm-project/releases/download/llvmorg-[% c("version") %]/cfe-[% c("version") %].src.tar.xz'
name: cfe
file_gpg_id: 1
- - URL: 'https://releases.llvm.org/[% c("version") %]/libcxx-[% c("version") %].src.tar.xz'
+ - URL: 'https://github.com/llvm/llvm-project/releases/download/llvmorg-[% c("version") %]/libcxx-[% c("version") %].src.tar.xz'
name: libcxx
file_gpg_id: 1
- - URL: 'https://releases.llvm.org/[% c("version") %]/libcxxabi-[% c("version") %].src.tar.xz'
+ - URL: 'https://github.com/llvm/llvm-project/releases/download/llvmorg-[% c("version") %]/libcxxabi-[% c("version") %].src.tar.xz'
name: libcxxabi
file_gpg_id: 1
- - URL: 'https://releases.llvm.org/[% c("version") %]/lld-[% c("version") %].src.tar.xz'
+ - URL: 'https://github.com/llvm/llvm-project/releases/download/llvmorg-[% c("version") %]/lld-[% c("version") %].src.tar.xz'
name: lld
file_gpg_id: 1
- - URL: 'https://releases.llvm.org/[% c("version") %]/compiler-rt-[% c("version") %].src.tar.xz'
+ - URL: 'https://github.com/llvm/llvm-project/releases/download/llvmorg-[% c("version") %]/compiler-rt-[% c("version") %].src.tar.xz'
name: compiler-rt
file_gpg_id: 1
- filename: win-patches
diff --git a/projects/mingw-w64-clang/config b/projects/mingw-w64-clang/config
index 32d18a8..11480b9 100644
--- a/projects/mingw-w64-clang/config
+++ b/projects/mingw-w64-clang/config
@@ -3,7 +3,7 @@ filename: '[% project %]-[% c("version") %]-[% c("var/build_id") %].tar.gz'
git_url: https://git.code.sf.net/p/mingw-w64/mingw-w64
git_hash: 0a1d495478d8ed1a94fc77b9dbb428b7e0372588
version: '[% c("abbrev") %]'
-llvm_version: 8.0.0
+llvm_version: 8.0.1
gpg_keyring: clang.gpg
sig_ext: sig
@@ -21,16 +21,16 @@ input_files:
name: clang
- project: cmake
name: cmake
- - URL: 'https://releases.llvm.org/[% c("llvm_version") %]/libcxx-[% c("llvm_version") %].src.tar.xz'
+ - URL: 'https://github.com/llvm/llvm-project/releases/download/llvmorg-[% c("llvm_version") %]/libcxx-[% c("llvm_version") %].src.tar.xz'
name: libcxx
file_gpg_id: 1
- - URL: 'https://releases.llvm.org/[% c("llvm_version") %]/libcxxabi-[% c("llvm_version") %].src.tar.xz'
+ - URL: 'https://github.com/llvm/llvm-project/releases/download/llvmorg-[% c("llvm_version") %]/libcxxabi-[% c("llvm_version") %].src.tar.xz'
name: libcxxabi
file_gpg_id: 1
- - URL: 'https://releases.llvm.org/[% c("llvm_version") %]/libunwind-[% c("llvm_version") %].src.tar.xz'
+ - URL: 'https://github.com/llvm/llvm-project/releases/download/llvmorg-[% c("llvm_version") %]/libunwind-[% c("llvm_version") %].src.tar.xz'
name: libunwind
file_gpg_id: 1
- - URL: 'https://releases.llvm.org/[% c("llvm_version") %]/compiler-rt-[% c("llvm_version") %].src.tar.xz'
+ - URL: 'https://github.com/llvm/llvm-project/releases/download/llvmorg-[% c("llvm_version") %]/compiler-rt-[% c("llvm_version") %].src.tar.xz'
name: compiler-rt
file_gpg_id: 1
- project: llvm-mingw
1
0
06 Feb '20
commit b334967863adbacfb05ebddc3933da6edcbb51c0
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Thu Feb 6 16:59:48 2020 +0000
Changelog update and build2
---
projects/firefox/config | 2 +-
projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt | 3 +++
rbm.conf | 2 +-
3 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/projects/firefox/config b/projects/firefox/config
index ccb9ec8..87010ee 100644
--- a/projects/firefox/config
+++ b/projects/firefox/config
@@ -1,7 +1,7 @@
# vim: filetype=yaml sw=2
version: '[% c("abbrev") %]'
filename: 'firefox-[% c("version") %]-[% c("var/osname") %]-[% c("var/build_id") %]'
-git_hash: 'tor-browser-[% c("var/firefox_version") %]-[% c("var/torbrowser_branch") %]-1-build1'
+git_hash: 'tor-browser-[% c("var/firefox_version") %]-[% c("var/torbrowser_branch") %]-1-build2'
tag_gpg_id: 1
git_url: https://git.torproject.org/tor-browser.git
git_submodule: 1
diff --git a/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt b/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
index 9ad5b4f..c576cdf 100644
--- a/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
+++ b/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
@@ -9,6 +9,9 @@ Tor Browser 9.0.5 -- February 11 2020
* Bump Tor to 0.4.2.6
* Windows
* Bug 32132: Re-enable jemalloc for Windows users
+ * Build System
+ * All Platforms
+ * Bug 32739: Bump clang to 8.0.1
Tor Browser 9.0.4 -- January 9 2020
* All Platforms
diff --git a/rbm.conf b/rbm.conf
index c394689..5e43719 100644
--- a/rbm.conf
+++ b/rbm.conf
@@ -25,7 +25,7 @@ buildconf:
var:
torbrowser_version: '9.0.5'
- torbrowser_build: 'build1'
+ torbrowser_build: 'build2'
torbrowser_incremental_from:
- 9.0.4
project_name: tor-browser
1
0
06 Feb '20
commit 06470dd9dc737547d43b1e15b96b441b0601add4
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Thu Feb 6 14:28:17 2020 +0000
Release preparations for 9.0.5
Versions bump and Changelog update
---
projects/firefox/config | 2 +-
projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt | 12 ++++++++++++
projects/tor-browser/config | 4 ++--
projects/tor/config | 2 +-
rbm.conf | 5 ++---
5 files changed, 18 insertions(+), 7 deletions(-)
diff --git a/projects/firefox/config b/projects/firefox/config
index f50af8c..ccb9ec8 100644
--- a/projects/firefox/config
+++ b/projects/firefox/config
@@ -8,7 +8,7 @@ git_submodule: 1
gpg_keyring: torbutton.gpg
var:
- firefox_platform_version: 68.4.1
+ firefox_platform_version: 68.5.0
firefox_version: '[% c("var/firefox_platform_version") %]esr'
torbrowser_branch: 9.0
torbrowser_update_channel: alpha
diff --git a/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt b/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
index 78dd726..9ad5b4f 100644
--- a/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
+++ b/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
@@ -1,3 +1,15 @@
+Tor Browser 9.0.5 -- February 11 2020
+ * All Platforms
+ * Update Firefox to 68.5.0esr
+ * Bump NoScript to 11.0.13
+ * Bug 32053: Fix LLVM reproducibility issues
+ * Bug 32255: Missing ORIGIN header breaks CORS
+ * Bug 32891: Add new default bridges
+ * Windows + OS X + Linux
+ * Bump Tor to 0.4.2.6
+ * Windows
+ * Bug 32132: Re-enable jemalloc for Windows users
+
Tor Browser 9.0.4 -- January 9 2020
* All Platforms
* Update Firefox to 68.4.1esr
diff --git a/projects/tor-browser/config b/projects/tor-browser/config
index c4de769..4e8ee14 100644
--- a/projects/tor-browser/config
+++ b/projects/tor-browser/config
@@ -73,9 +73,9 @@ input_files:
enable: '[% c("var/snowflake") %]'
- filename: Bundle-Data
enable: '[% ! c("var/android") %]'
- - URL: https://addons.cdn.mozilla.net/user-media/addons/722/noscript_security_suit…
+ - URL: https://addons.cdn.mozilla.net/user-media/addons/722/noscript_security_suit…
name: noscript
- sha256sum: 1b0daa12e1b8fbc8e30e7bdb5689b12774aaa9f883cb3e9ad57943a883ce65b5
+ sha256sum: ced718d9d9e719547db392ad85d24a7ad5c6b54cc0f93f9c57f2fcb44bb4de56
- filename: 'RelativeLink/start-tor-browser.desktop'
enable: '[% c("var/linux") %]'
- filename: 'RelativeLink/execdesktop'
diff --git a/projects/tor/config b/projects/tor/config
index 4a1045c..45e2a63 100644
--- a/projects/tor/config
+++ b/projects/tor/config
@@ -1,6 +1,6 @@
# vim: filetype=yaml sw=2
filename: '[% project %]-[% c("version") %]-[% c("var/osname") %]-[% c("var/build_id") %]'
-version: 0.4.2.5
+version: 0.4.2.6
git_hash: 'tor-[% c("version") %]'
git_url: https://git.torproject.org/tor.git
git_submodule: 1
diff --git a/rbm.conf b/rbm.conf
index d8fccd1..c394689 100644
--- a/rbm.conf
+++ b/rbm.conf
@@ -24,11 +24,10 @@ buildconf:
git_signtag_opt: '-s'
var:
- torbrowser_version: '9.0.4'
+ torbrowser_version: '9.0.5'
torbrowser_build: 'build1'
torbrowser_incremental_from:
- - 9.0.2
- - 9.0.3
+ - 9.0.4
project_name: tor-browser
multi_lingual: 0
build_mar: 1
1
0
[tor-browser-build/master] Add missing '#' characters in license headers
by gk@torproject.org 06 Feb '20
by gk@torproject.org 06 Feb '20
06 Feb '20
commit 28c15aa19da511b213ef6e1708116013fbaef9a3
Author: Georg Koppen <gk(a)torproject.org>
Date: Thu Feb 6 10:20:22 2020 +0000
Add missing '#' characters in license headers
---
tools/authenticode_check.sh | 2 +-
tools/hash_signed_bundles.sh | 2 +-
tools/marsigning_check.sh | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/tools/authenticode_check.sh b/tools/authenticode_check.sh
index 819c9d1..5d3b4cc 100755
--- a/tools/authenticode_check.sh
+++ b/tools/authenticode_check.sh
@@ -5,7 +5,7 @@
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
-
+#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
diff --git a/tools/hash_signed_bundles.sh b/tools/hash_signed_bundles.sh
index 4354d47..1e21c49 100755
--- a/tools/hash_signed_bundles.sh
+++ b/tools/hash_signed_bundles.sh
@@ -5,7 +5,7 @@
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
-
+#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
diff --git a/tools/marsigning_check.sh b/tools/marsigning_check.sh
index 0663603..3e58249 100755
--- a/tools/marsigning_check.sh
+++ b/tools/marsigning_check.sh
@@ -5,7 +5,7 @@
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
-
+#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
1
0
[tor-browser-build/maint-9.0] Bug 32891: Pick up new default bridge
by sysrqb@torproject.org 06 Feb '20
by sysrqb@torproject.org 06 Feb '20
06 Feb '20
commit 00fcc3970b4f0ebd924890cda54fa3ab347694a6
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Wed Feb 5 00:30:06 2020 +0000
Bug 32891: Pick up new default bridge
---
projects/tor-android-service/config | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/projects/tor-android-service/config b/projects/tor-android-service/config
index b65c657..b0dc4b0 100644
--- a/projects/tor-android-service/config
+++ b/projects/tor-android-service/config
@@ -1,7 +1,7 @@
# vim: filetype=yaml sw=2
version: '[% c("abbrev") %]'
filename: '[% project %]-[% c("version") %]-[% c("var/build_id") %]'
-git_hash: 4a81e5806f36e7d0bf9492437d824599ecf4ff43
+git_hash: 18ba7d2780b1d5194cc5854d703655f6c9d3d196
git_url: https://git.torproject.org/tor-android-service.git
git_submodule: 1
1
0
[tor-browser-build/maint-9.0] Bug 32053: Fix LLVM reproducibility issues
by sysrqb@torproject.org 06 Feb '20
by sysrqb@torproject.org 06 Feb '20
06 Feb '20
commit 0fbb6fa8a942e8243130f8c68616a28d4181a090
Author: Georg Koppen <gk(a)torproject.org>
Date: Fri Dec 6 13:43:24 2019 +0000
Bug 32053: Fix LLVM reproducibility issues
This patch contains two backports for reproducibility issues found and
fixed in LLVM's optimization code.
The patch from bug 42574 might not be necessary in our context as I only
witnessed problems when compiling Stylo with an older Rust (1.32.0) and
then omptimizing with LLVM 8. However, it's hard to exclude any
mismatching builds we encountered so far from being affected by that
issue, so I think it is safer to backport that patch as well.
Bug 43909 is an issue we and Mozilla definitely hit and very likely
responsible for at least the vast majority of different builds we got
over the course of the last weeks and months. Many thanks to Alex
Crichton for the invaluable help in tracking this issue down.
---
projects/clang/42574.patch | 236 ++++++++++++++++++++++++++++++++++++++++++
projects/clang/43909.patch | 252 +++++++++++++++++++++++++++++++++++++++++++++
projects/clang/build | 4 +
projects/clang/config | 2 +
projects/rust/42574.patch | 236 ++++++++++++++++++++++++++++++++++++++++++
projects/rust/43909.patch | 252 +++++++++++++++++++++++++++++++++++++++++++++
projects/rust/build | 7 ++
projects/rust/config | 2 +
8 files changed, 991 insertions(+)
diff --git a/projects/clang/42574.patch b/projects/clang/42574.patch
new file mode 100644
index 0000000..285d254
--- /dev/null
+++ b/projects/clang/42574.patch
@@ -0,0 +1,236 @@
+From 3757213db371dcea53cae357cf9c56d1b0604f98 Mon Sep 17 00:00:00 2001
+From: Alina Sbirlea <asbirlea(a)google.com>
+Date: Fri, 12 Jul 2019 22:30:30 +0000
+Subject: [PATCH] [MemorySSA] Use SetVector to avoid nondeterminism.
+
+Summary:
+Use a SetVector for DeadBlockSet.
+Resolves PR42574.
+
+Reviewers: george.burgess.iv, uabelho, dblaikie
+
+Subscribers: jlebar, Prazek, mgrang, llvm-commits
+
+Tags: #llvm
+
+Differential Revision: https://reviews.llvm.org/D64601
+
+llvm-svn: 365970
+
+diff --git a/llvm/include/llvm/Analysis/MemorySSAUpdater.h b/llvm/include/llvm/Analysis/MemorySSAUpdater.h
+index 169d5bd9fa8..276620bd445 100644
+--- a/llvm/include/llvm/Analysis/MemorySSAUpdater.h
++++ b/llvm/include/llvm/Analysis/MemorySSAUpdater.h
+@@ -32,6 +32,7 @@
+ #ifndef LLVM_ANALYSIS_MEMORYSSAUPDATER_H
+ #define LLVM_ANALYSIS_MEMORYSSAUPDATER_H
+
++#include "llvm/ADT/SetVector.h"
+ #include "llvm/ADT/SmallPtrSet.h"
+ #include "llvm/ADT/SmallSet.h"
+ #include "llvm/ADT/SmallVector.h"
+@@ -239,7 +240,7 @@ public:
+ /// Deleted blocks still have successor info, but their predecessor edges and
+ /// Phi nodes may already be updated. Instructions in DeadBlocks should be
+ /// deleted after this call.
+- void removeBlocks(const SmallPtrSetImpl<BasicBlock *> &DeadBlocks);
++ void removeBlocks(const SmallSetVector<BasicBlock *, 8> &DeadBlocks);
+
+ /// Get handle on MemorySSA.
+ MemorySSA* getMemorySSA() const { return MSSA; }
+diff --git a/llvm/lib/Analysis/MemorySSAUpdater.cpp b/llvm/lib/Analysis/MemorySSAUpdater.cpp
+index 6c817d20368..a6c7142a697 100644
+--- a/llvm/lib/Analysis/MemorySSAUpdater.cpp
++++ b/llvm/lib/Analysis/MemorySSAUpdater.cpp
+@@ -1101,7 +1101,7 @@ void MemorySSAUpdater::removeMemoryAccess(MemoryAccess *MA) {
+ }
+
+ void MemorySSAUpdater::removeBlocks(
+- const SmallPtrSetImpl<BasicBlock *> &DeadBlocks) {
++ const SmallSetVector<BasicBlock *, 8> &DeadBlocks) {
+ // First delete all uses of BB in MemoryPhis.
+ for (BasicBlock *BB : DeadBlocks) {
+ Instruction *TI = BB->getTerminator();
+diff --git a/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp b/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp
+index 2e5927f9a06..f464df26a02 100644
+--- a/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp
++++ b/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp
+@@ -388,8 +388,8 @@ private:
+ void deleteDeadLoopBlocks() {
+ DomTreeUpdater DTU(DT, DomTreeUpdater::UpdateStrategy::Eager);
+ if (MSSAU) {
+- SmallPtrSet<BasicBlock *, 8> DeadLoopBlocksSet(DeadLoopBlocks.begin(),
+- DeadLoopBlocks.end());
++ SmallSetVector<BasicBlock *, 8> DeadLoopBlocksSet(DeadLoopBlocks.begin(),
++ DeadLoopBlocks.end());
+ MSSAU->removeBlocks(DeadLoopBlocksSet);
+ }
+ for (auto *BB : DeadLoopBlocks) {
+diff --git a/llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp b/llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp
+index 5a67178cef3..814cf814989 100644
+--- a/llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp
++++ b/llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp
+@@ -1436,8 +1436,8 @@ deleteDeadClonedBlocks(Loop &L, ArrayRef<BasicBlock *> ExitBlocks,
+
+ // Remove all MemorySSA in the dead blocks
+ if (MSSAU) {
+- SmallPtrSet<BasicBlock *, 16> DeadBlockSet(DeadBlocks.begin(),
+- DeadBlocks.end());
++ SmallSetVector<BasicBlock *, 8> DeadBlockSet(DeadBlocks.begin(),
++ DeadBlocks.end());
+ MSSAU->removeBlocks(DeadBlockSet);
+ }
+
+@@ -1455,7 +1455,7 @@ static void deleteDeadBlocksFromLoop(Loop &L,
+ MemorySSAUpdater *MSSAU) {
+ // Find all the dead blocks tied to this loop, and remove them from their
+ // successors.
+- SmallPtrSet<BasicBlock *, 16> DeadBlockSet;
++ SmallSetVector<BasicBlock *, 8> DeadBlockSet;
+
+ // Start with loop/exit blocks and get a transitive closure of reachable dead
+ // blocks.
+diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp
+index 499e611acb5..83dabcd7952 100644
+--- a/llvm/lib/Transforms/Utils/Local.cpp
++++ b/llvm/lib/Transforms/Utils/Local.cpp
+@@ -2211,7 +2211,7 @@ bool llvm::removeUnreachableBlocks(Function &F, LazyValueInfo *LVI,
+ assert(Reachable.size() < F.size());
+ NumRemoved += F.size()-Reachable.size();
+
+- SmallPtrSet<BasicBlock *, 16> DeadBlockSet;
++ SmallSetVector<BasicBlock *, 8> DeadBlockSet;
+ for (Function::iterator I = ++F.begin(), E = F.end(); I != E; ++I) {
+ auto *BB = &*I;
+ if (Reachable.count(BB))
+diff --git a/llvm/test/Analysis/MemorySSA/nondeterminism.ll b/llvm/test/Analysis/MemorySSA/nondeterminism.ll
+new file mode 100644
+index 00000000000..0bb3df30b58
+--- /dev/null
++++ b/llvm/test/Analysis/MemorySSA/nondeterminism.ll
+@@ -0,0 +1,122 @@
++; RUN: opt -simplifycfg -enable-mssa-loop-dependency -S --preserve-ll-uselistorder %s | FileCheck %s
++; REQUIRES: x86-registered-target
++; CHECK-LABEL: @n
++; CHECK: uselistorder i16 0, { 3, 2, 4, 1, 5, 0, 6 }
++
++; Note: test was added in an effort to ensure determinism when updating memoryssa. See PR42574.
++; If the uselistorder check becomes no longer relevant, the test can be disabled or removed.
++
++%rec9 = type { i16, i32, i32 }
++
++@a = global [1 x [1 x %rec9]] zeroinitializer
++
++define i16 @n() {
++ br label %..split_crit_edge
++
++..split_crit_edge: ; preds = %0
++ br label %.split
++
++bb4.us4: ; preds = %bb2.split.us32, %bb6.us28
++ %i.4.01.us5 = phi i16 [ %_tmp49.us30, %bb6.us28 ]
++ br label %g.exit4.us21
++
++bb1.i.us14: ; preds = %bb4.us4
++ br label %g.exit4.us21
++
++g.exit4.us21: ; preds = %bb1.i.us14, %g.exit4.critedge.us9
++ %i.4.02.us22 = phi i16 [ %i.4.01.us5, %bb4.us4 ], [ %i.4.01.us5, %bb1.i.us14 ]
++ br label %bb6.us28
++
++bb5.us26: ; preds = %g.exit4.us21
++ br label %bb6.us28
++
++bb6.us28: ; preds = %bb5.us26, %g.exit4.us21
++ %i.4.03.us29 = phi i16 [ %i.4.02.us22, %bb5.us26 ], [ %i.4.02.us22, %g.exit4.us21 ]
++ %_tmp49.us30 = add nuw nsw i16 %i.4.03.us29, 1
++ br label %bb4.us4
++
++bb4.us.us: ; preds = %bb2.split.us.us, %bb6.us.us
++ %i.4.01.us.us = phi i16 [ %_tmp49.us.us, %bb6.us.us ]
++ br label %bb1.i.us.us
++
++bb1.i.us.us: ; preds = %bb4.us.us
++ br label %g.exit4.us.us
++
++g.exit4.us.us: ; preds = %bb1.i.us.us, %g.exit4.critedge.us.us
++ %i.4.02.us.us = phi i16 [ %i.4.01.us.us, %bb1.i.us.us ]
++ br label %bb5.us.us
++
++bb5.us.us: ; preds = %g.exit4.us.us
++ br label %bb6.us.us
++
++bb6.us.us: ; preds = %bb5.us.us, %g.exit4.us.us
++ %i.4.03.us.us = phi i16 [ %i.4.02.us.us, %bb5.us.us ]
++ %_tmp49.us.us = add nuw nsw i16 %i.4.03.us.us, 1
++ br label %bb4.us.us
++
++
++.split: ; preds = %..split_crit_edge
++ br label %bb2
++
++bb2: ; preds = %.split, %bb7
++ %h.3.0 = phi i16 [ undef, %.split ], [ %_tmp53, %bb7 ]
++ br label %bb2.bb2.split_crit_edge
++
++bb2.bb2.split_crit_edge: ; preds = %bb2
++ br label %bb2.split
++
++bb2.split.us: ; preds = %bb2
++ br label %bb4.us
++
++bb4.us: ; preds = %bb6.us, %bb2.split.us
++ %i.4.01.us = phi i16 [ 0, %bb2.split.us ]
++ br label %bb1.i.us
++
++g.exit4.critedge.us: ; preds = %bb4.us
++ br label %g.exit4.us
++
++bb1.i.us: ; preds = %bb4.us
++ br label %g.exit4.us
++
++g.exit4.us: ; preds = %bb1.i.us, %g.exit4.critedge.us
++ %i.4.02.us = phi i16 [ %i.4.01.us, %g.exit4.critedge.us ], [ %i.4.01.us, %bb1.i.us ]
++ br label %bb5.us
++
++bb5.us: ; preds = %g.exit4.us
++ br label %bb7
++
++bb2.split: ; preds = %bb2.bb2.split_crit_edge
++ br label %bb4
++
++bb4: ; preds = %bb2.split, %bb6
++ %i.4.01 = phi i16 [ 0, %bb2.split ]
++ %_tmp16 = getelementptr [1 x [1 x %rec9]], [1 x [1 x %rec9]]* @a, i16 0, i16 %h.3.0, i16 %i.4.01, i32 0
++ %_tmp17 = load i16, i16* %_tmp16, align 1
++ br label %g.exit4.critedge
++
++bb1.i: ; preds = %bb4
++ br label %g.exit4
++
++g.exit4.critedge: ; preds = %bb4
++ %_tmp28.c = getelementptr [1 x [1 x %rec9]], [1 x [1 x %rec9]]* @a, i16 0, i16 %h.3.0, i16 %i.4.01, i32 1
++ %_tmp29.c = load i32, i32* %_tmp28.c, align 1
++ %_tmp30.c = trunc i32 %_tmp29.c to i16
++ br label %g.exit4
++
++g.exit4: ; preds = %g.exit4.critedge, %bb1.i
++ %i.4.02 = phi i16 [ %i.4.01, %g.exit4.critedge ], [ %i.4.01, %bb1.i ]
++ %_tmp41 = getelementptr [1 x [1 x %rec9]], [1 x [1 x %rec9]]* @a, i16 0, i16 %h.3.0, i16 %i.4.02, i32 2
++ br label %bb6
++
++bb5: ; preds = %g.exit4
++ br label %bb6
++
++bb6: ; preds = %bb5, %g.exit4
++ %i.4.03 = phi i16 [ %i.4.02, %bb5 ], [ %i.4.02, %g.exit4 ]
++ %_tmp49 = add nuw nsw i16 %i.4.03, 1
++ br label %bb7
++
++bb7: ; preds = %bb7.us-lcssa.us, %bb7.us-lcssa
++ %_tmp53 = add nsw i16 %h.3.0, 1
++ br label %bb2
++}
+--
+2.24.0
+
diff --git a/projects/clang/43909.patch b/projects/clang/43909.patch
new file mode 100644
index 0000000..78d2a75
--- /dev/null
+++ b/projects/clang/43909.patch
@@ -0,0 +1,252 @@
+From c95310f2d4fd3c88241c3b5d6dbf6251d34a3256 Mon Sep 17 00:00:00 2001
+From: Nikita Popov <nikita.ppv(a)gmail.com>
+Date: Sat, 16 Nov 2019 16:22:18 +0100
+Subject: [PATCH] Restructure caching
+
+Variant on D70103. The caching is switched to always use a BB to
+cache entry map, which then contains per-value caches. A separate
+set contains value handles with a deletion callback. This allows us
+to properly invalidate overdefined values.
+
+A possible alternative would be to always cache by value first and
+have per-BB maps/sets in the each cache entry. In that case we could
+use a ValueMap and would avoid the separate value handle set. I went
+with the BB indexing at the top level to make it easier to integrate
+D69914, but possibly that's not the right choice.
+
+Differential Revision: https://reviews.llvm.org/D70376
+
+diff --git a/llvm/lib/Analysis/LazyValueInfo.cpp b/llvm/lib/Analysis/LazyValueInfo.cpp
+index 110c085d3f3..aa6862cb588 100644
+--- a/llvm/lib/Analysis/LazyValueInfo.cpp
++++ b/llvm/lib/Analysis/LazyValueInfo.cpp
+@@ -133,12 +133,9 @@ namespace {
+ /// A callback value handle updates the cache when values are erased.
+ class LazyValueInfoCache;
+ struct LVIValueHandle final : public CallbackVH {
+- // Needs to access getValPtr(), which is protected.
+- friend struct DenseMapInfo<LVIValueHandle>;
+-
+ LazyValueInfoCache *Parent;
+
+- LVIValueHandle(Value *V, LazyValueInfoCache *P)
++ LVIValueHandle(Value *V, LazyValueInfoCache *P = nullptr)
+ : CallbackVH(V), Parent(P) { }
+
+ void deleted() override;
+@@ -152,89 +149,63 @@ namespace {
+ /// This is the cache kept by LazyValueInfo which
+ /// maintains information about queries across the clients' queries.
+ class LazyValueInfoCache {
+- /// This is all of the cached block information for exactly one Value*.
+- /// The entries are sorted by the BasicBlock* of the
+- /// entries, allowing us to do a lookup with a binary search.
+- /// Over-defined lattice values are recorded in OverDefinedCache to reduce
+- /// memory overhead.
+- struct ValueCacheEntryTy {
+- ValueCacheEntryTy(Value *V, LazyValueInfoCache *P) : Handle(V, P) {}
+- LVIValueHandle Handle;
+- SmallDenseMap<PoisoningVH<BasicBlock>, ValueLatticeElement, 4> BlockVals;
++ /// This is all of the cached information for one basic block. It contains
++ /// the per-value lattice elements, as well as a separate set for
++ /// overdefined values to reduce memory usage.
++ struct BlockCacheEntryTy {
++ SmallDenseMap<AssertingVH<Value>, ValueLatticeElement, 4> LatticeElements;
++ SmallDenseSet<AssertingVH<Value>, 4> OverDefined;
+ };
+
+- /// This tracks, on a per-block basis, the set of values that are
+- /// over-defined at the end of that block.
+- typedef DenseMap<PoisoningVH<BasicBlock>, SmallPtrSet<Value *, 4>>
+- OverDefinedCacheTy;
+- /// Keep track of all blocks that we have ever seen, so we
+- /// don't spend time removing unused blocks from our caches.
+- DenseSet<PoisoningVH<BasicBlock> > SeenBlocks;
+-
+- /// This is all of the cached information for all values,
+- /// mapped from Value* to key information.
+- DenseMap<Value *, std::unique_ptr<ValueCacheEntryTy>> ValueCache;
+- OverDefinedCacheTy OverDefinedCache;
+-
++ /// Cached information per basic block.
++ DenseMap<PoisoningVH<BasicBlock>, BlockCacheEntryTy> BlockCache;
++ /// Set of value handles used to erase values from the cache on deletion.
++ DenseSet<LVIValueHandle, DenseMapInfo<Value *>> ValueHandles;
+
+ public:
+ void insertResult(Value *Val, BasicBlock *BB,
+ const ValueLatticeElement &Result) {
+- SeenBlocks.insert(BB);
+-
++ auto &CacheEntry = BlockCache.try_emplace(BB).first->second;
+ // Insert over-defined values into their own cache to reduce memory
+ // overhead.
+ if (Result.isOverdefined())
+- OverDefinedCache[BB].insert(Val);
+- else {
+- auto It = ValueCache.find_as(Val);
+- if (It == ValueCache.end()) {
+- ValueCache[Val] = make_unique<ValueCacheEntryTy>(Val, this);
+- It = ValueCache.find_as(Val);
+- assert(It != ValueCache.end() && "Val was just added to the map!");
+- }
+- It->second->BlockVals[BB] = Result;
+- }
+- }
+-
+- bool isOverdefined(Value *V, BasicBlock *BB) const {
+- auto ODI = OverDefinedCache.find(BB);
+-
+- if (ODI == OverDefinedCache.end())
+- return false;
++ CacheEntry.OverDefined.insert(Val);
++ else
++ CacheEntry.LatticeElements.insert({ Val, Result });
+
+- return ODI->second.count(V);
++ auto HandleIt = ValueHandles.find_as(Val);
++ if (HandleIt == ValueHandles.end())
++ ValueHandles.insert({ Val, this });
+ }
+
+ bool hasCachedValueInfo(Value *V, BasicBlock *BB) const {
+- if (isOverdefined(V, BB))
+- return true;
+-
+- auto I = ValueCache.find_as(V);
+- if (I == ValueCache.end())
++ auto It = BlockCache.find(BB);
++ if (It == BlockCache.end())
+ return false;
+
+- return I->second->BlockVals.count(BB);
++ return It->second.OverDefined.count(V) ||
++ It->second.LatticeElements.count(V);
+ }
+
+ ValueLatticeElement getCachedValueInfo(Value *V, BasicBlock *BB) const {
+- if (isOverdefined(V, BB))
++ auto It = BlockCache.find(BB);
++ if (It == BlockCache.end())
++ return ValueLatticeElement();
++
++ if (It->second.OverDefined.count(V))
+ return ValueLatticeElement::getOverdefined();
+
+- auto I = ValueCache.find_as(V);
+- if (I == ValueCache.end())
++ auto LatticeIt = It->second.LatticeElements.find(V);
++ if (LatticeIt == It->second.LatticeElements.end())
+ return ValueLatticeElement();
+- auto BBI = I->second->BlockVals.find(BB);
+- if (BBI == I->second->BlockVals.end())
+- return ValueLatticeElement();
+- return BBI->second;
++
++ return LatticeIt->second;
+ }
+
+ /// clear - Empty the cache.
+ void clear() {
+- SeenBlocks.clear();
+- ValueCache.clear();
+- OverDefinedCache.clear();
++ BlockCache.clear();
++ ValueHandles.clear();
+ }
+
+ /// Inform the cache that a given value has been deleted.
+@@ -248,23 +219,18 @@ namespace {
+ /// OldSucc might have (unless also overdefined in NewSucc). This just
+ /// flushes elements from the cache and does not add any.
+ void threadEdgeImpl(BasicBlock *OldSucc,BasicBlock *NewSucc);
+-
+- friend struct LVIValueHandle;
+ };
+ }
+
+ void LazyValueInfoCache::eraseValue(Value *V) {
+- for (auto I = OverDefinedCache.begin(), E = OverDefinedCache.end(); I != E;) {
+- // Copy and increment the iterator immediately so we can erase behind
+- // ourselves.
+- auto Iter = I++;
+- SmallPtrSetImpl<Value *> &ValueSet = Iter->second;
+- ValueSet.erase(V);
+- if (ValueSet.empty())
+- OverDefinedCache.erase(Iter);
++ for (auto &Pair : BlockCache) {
++ Pair.second.LatticeElements.erase(V);
++ Pair.second.OverDefined.erase(V);
+ }
+
+- ValueCache.erase(V);
++ auto HandleIt = ValueHandles.find_as(V);
++ if (HandleIt != ValueHandles.end())
++ ValueHandles.erase(HandleIt);
+ }
+
+ void LVIValueHandle::deleted() {
+@@ -274,18 +240,7 @@ void LVIValueHandle::deleted() {
+ }
+
+ void LazyValueInfoCache::eraseBlock(BasicBlock *BB) {
+- // Shortcut if we have never seen this block.
+- DenseSet<PoisoningVH<BasicBlock> >::iterator I = SeenBlocks.find(BB);
+- if (I == SeenBlocks.end())
+- return;
+- SeenBlocks.erase(I);
+-
+- auto ODI = OverDefinedCache.find(BB);
+- if (ODI != OverDefinedCache.end())
+- OverDefinedCache.erase(ODI);
+-
+- for (auto &I : ValueCache)
+- I.second->BlockVals.erase(BB);
++ BlockCache.erase(BB);
+ }
+
+ void LazyValueInfoCache::threadEdgeImpl(BasicBlock *OldSucc,
+@@ -303,10 +258,11 @@ void LazyValueInfoCache::threadEdgeImpl(BasicBlock *OldSucc,
+ std::vector<BasicBlock*> worklist;
+ worklist.push_back(OldSucc);
+
+- auto I = OverDefinedCache.find(OldSucc);
+- if (I == OverDefinedCache.end())
++ auto I = BlockCache.find(OldSucc);
++ if (I == BlockCache.end() || I->second.OverDefined.empty())
+ return; // Nothing to process here.
+- SmallVector<Value *, 4> ValsToClear(I->second.begin(), I->second.end());
++ SmallVector<Value *, 4> ValsToClear(I->second.OverDefined.begin(),
++ I->second.OverDefined.end());
+
+ // Use a worklist to perform a depth-first search of OldSucc's successors.
+ // NOTE: We do not need a visited list since any blocks we have already
+@@ -320,10 +276,10 @@ void LazyValueInfoCache::threadEdgeImpl(BasicBlock *OldSucc,
+ if (ToUpdate == NewSucc) continue;
+
+ // If a value was marked overdefined in OldSucc, and is here too...
+- auto OI = OverDefinedCache.find(ToUpdate);
+- if (OI == OverDefinedCache.end())
++ auto OI = BlockCache.find(ToUpdate);
++ if (OI == BlockCache.end() || OI->second.OverDefined.empty())
+ continue;
+- SmallPtrSetImpl<Value *> &ValueSet = OI->second;
++ auto &ValueSet = OI->second.OverDefined;
+
+ bool changed = false;
+ for (Value *V : ValsToClear) {
+@@ -333,11 +289,6 @@ void LazyValueInfoCache::threadEdgeImpl(BasicBlock *OldSucc,
+ // If we removed anything, then we potentially need to update
+ // blocks successors too.
+ changed = true;
+-
+- if (ValueSet.empty()) {
+- OverDefinedCache.erase(OI);
+- break;
+- }
+ }
+
+ if (!changed) continue;
+--
+2.24.0
+
diff --git a/projects/clang/build b/projects/clang/build
index c1afa6d..825b21e 100644
--- a/projects/clang/build
+++ b/projects/clang/build
@@ -20,6 +20,10 @@ tar -xf $rootdir/[% c('input_files_by_name/libcxxabi') %]
tar -xf $rootdir/[% c('input_files_by_name/lld') %]
tar -xf $rootdir/[% c('input_files_by_name/compiler-rt') %]
mv llvm-* llvm
+# LLVM has reproducibility issues when optimizing bitcode, which we need to
+# patch. See: #32053 for more details.
+patch -p1 < $rootdir/42574.patch
+patch -p1 < $rootdir/43909.patch
mv cfe-* llvm/tools/clang
mv libcxx-* llvm/projects/libcxx
mv libcxxabi-* llvm/projects/libcxxabi
diff --git a/projects/clang/config b/projects/clang/config
index 08231be..59a9102 100644
--- a/projects/clang/config
+++ b/projects/clang/config
@@ -45,3 +45,5 @@ input_files:
enable: '[% c("var/windows") %]'
- filename: timestamp.patch
enable: '[% c("var/windows") %]'
+ - filename: 42574.patch
+ - filename: 43909.patch
diff --git a/projects/rust/42574.patch b/projects/rust/42574.patch
new file mode 100644
index 0000000..285d254
--- /dev/null
+++ b/projects/rust/42574.patch
@@ -0,0 +1,236 @@
+From 3757213db371dcea53cae357cf9c56d1b0604f98 Mon Sep 17 00:00:00 2001
+From: Alina Sbirlea <asbirlea(a)google.com>
+Date: Fri, 12 Jul 2019 22:30:30 +0000
+Subject: [PATCH] [MemorySSA] Use SetVector to avoid nondeterminism.
+
+Summary:
+Use a SetVector for DeadBlockSet.
+Resolves PR42574.
+
+Reviewers: george.burgess.iv, uabelho, dblaikie
+
+Subscribers: jlebar, Prazek, mgrang, llvm-commits
+
+Tags: #llvm
+
+Differential Revision: https://reviews.llvm.org/D64601
+
+llvm-svn: 365970
+
+diff --git a/llvm/include/llvm/Analysis/MemorySSAUpdater.h b/llvm/include/llvm/Analysis/MemorySSAUpdater.h
+index 169d5bd9fa8..276620bd445 100644
+--- a/llvm/include/llvm/Analysis/MemorySSAUpdater.h
++++ b/llvm/include/llvm/Analysis/MemorySSAUpdater.h
+@@ -32,6 +32,7 @@
+ #ifndef LLVM_ANALYSIS_MEMORYSSAUPDATER_H
+ #define LLVM_ANALYSIS_MEMORYSSAUPDATER_H
+
++#include "llvm/ADT/SetVector.h"
+ #include "llvm/ADT/SmallPtrSet.h"
+ #include "llvm/ADT/SmallSet.h"
+ #include "llvm/ADT/SmallVector.h"
+@@ -239,7 +240,7 @@ public:
+ /// Deleted blocks still have successor info, but their predecessor edges and
+ /// Phi nodes may already be updated. Instructions in DeadBlocks should be
+ /// deleted after this call.
+- void removeBlocks(const SmallPtrSetImpl<BasicBlock *> &DeadBlocks);
++ void removeBlocks(const SmallSetVector<BasicBlock *, 8> &DeadBlocks);
+
+ /// Get handle on MemorySSA.
+ MemorySSA* getMemorySSA() const { return MSSA; }
+diff --git a/llvm/lib/Analysis/MemorySSAUpdater.cpp b/llvm/lib/Analysis/MemorySSAUpdater.cpp
+index 6c817d20368..a6c7142a697 100644
+--- a/llvm/lib/Analysis/MemorySSAUpdater.cpp
++++ b/llvm/lib/Analysis/MemorySSAUpdater.cpp
+@@ -1101,7 +1101,7 @@ void MemorySSAUpdater::removeMemoryAccess(MemoryAccess *MA) {
+ }
+
+ void MemorySSAUpdater::removeBlocks(
+- const SmallPtrSetImpl<BasicBlock *> &DeadBlocks) {
++ const SmallSetVector<BasicBlock *, 8> &DeadBlocks) {
+ // First delete all uses of BB in MemoryPhis.
+ for (BasicBlock *BB : DeadBlocks) {
+ Instruction *TI = BB->getTerminator();
+diff --git a/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp b/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp
+index 2e5927f9a06..f464df26a02 100644
+--- a/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp
++++ b/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp
+@@ -388,8 +388,8 @@ private:
+ void deleteDeadLoopBlocks() {
+ DomTreeUpdater DTU(DT, DomTreeUpdater::UpdateStrategy::Eager);
+ if (MSSAU) {
+- SmallPtrSet<BasicBlock *, 8> DeadLoopBlocksSet(DeadLoopBlocks.begin(),
+- DeadLoopBlocks.end());
++ SmallSetVector<BasicBlock *, 8> DeadLoopBlocksSet(DeadLoopBlocks.begin(),
++ DeadLoopBlocks.end());
+ MSSAU->removeBlocks(DeadLoopBlocksSet);
+ }
+ for (auto *BB : DeadLoopBlocks) {
+diff --git a/llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp b/llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp
+index 5a67178cef3..814cf814989 100644
+--- a/llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp
++++ b/llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp
+@@ -1436,8 +1436,8 @@ deleteDeadClonedBlocks(Loop &L, ArrayRef<BasicBlock *> ExitBlocks,
+
+ // Remove all MemorySSA in the dead blocks
+ if (MSSAU) {
+- SmallPtrSet<BasicBlock *, 16> DeadBlockSet(DeadBlocks.begin(),
+- DeadBlocks.end());
++ SmallSetVector<BasicBlock *, 8> DeadBlockSet(DeadBlocks.begin(),
++ DeadBlocks.end());
+ MSSAU->removeBlocks(DeadBlockSet);
+ }
+
+@@ -1455,7 +1455,7 @@ static void deleteDeadBlocksFromLoop(Loop &L,
+ MemorySSAUpdater *MSSAU) {
+ // Find all the dead blocks tied to this loop, and remove them from their
+ // successors.
+- SmallPtrSet<BasicBlock *, 16> DeadBlockSet;
++ SmallSetVector<BasicBlock *, 8> DeadBlockSet;
+
+ // Start with loop/exit blocks and get a transitive closure of reachable dead
+ // blocks.
+diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp
+index 499e611acb5..83dabcd7952 100644
+--- a/llvm/lib/Transforms/Utils/Local.cpp
++++ b/llvm/lib/Transforms/Utils/Local.cpp
+@@ -2211,7 +2211,7 @@ bool llvm::removeUnreachableBlocks(Function &F, LazyValueInfo *LVI,
+ assert(Reachable.size() < F.size());
+ NumRemoved += F.size()-Reachable.size();
+
+- SmallPtrSet<BasicBlock *, 16> DeadBlockSet;
++ SmallSetVector<BasicBlock *, 8> DeadBlockSet;
+ for (Function::iterator I = ++F.begin(), E = F.end(); I != E; ++I) {
+ auto *BB = &*I;
+ if (Reachable.count(BB))
+diff --git a/llvm/test/Analysis/MemorySSA/nondeterminism.ll b/llvm/test/Analysis/MemorySSA/nondeterminism.ll
+new file mode 100644
+index 00000000000..0bb3df30b58
+--- /dev/null
++++ b/llvm/test/Analysis/MemorySSA/nondeterminism.ll
+@@ -0,0 +1,122 @@
++; RUN: opt -simplifycfg -enable-mssa-loop-dependency -S --preserve-ll-uselistorder %s | FileCheck %s
++; REQUIRES: x86-registered-target
++; CHECK-LABEL: @n
++; CHECK: uselistorder i16 0, { 3, 2, 4, 1, 5, 0, 6 }
++
++; Note: test was added in an effort to ensure determinism when updating memoryssa. See PR42574.
++; If the uselistorder check becomes no longer relevant, the test can be disabled or removed.
++
++%rec9 = type { i16, i32, i32 }
++
++@a = global [1 x [1 x %rec9]] zeroinitializer
++
++define i16 @n() {
++ br label %..split_crit_edge
++
++..split_crit_edge: ; preds = %0
++ br label %.split
++
++bb4.us4: ; preds = %bb2.split.us32, %bb6.us28
++ %i.4.01.us5 = phi i16 [ %_tmp49.us30, %bb6.us28 ]
++ br label %g.exit4.us21
++
++bb1.i.us14: ; preds = %bb4.us4
++ br label %g.exit4.us21
++
++g.exit4.us21: ; preds = %bb1.i.us14, %g.exit4.critedge.us9
++ %i.4.02.us22 = phi i16 [ %i.4.01.us5, %bb4.us4 ], [ %i.4.01.us5, %bb1.i.us14 ]
++ br label %bb6.us28
++
++bb5.us26: ; preds = %g.exit4.us21
++ br label %bb6.us28
++
++bb6.us28: ; preds = %bb5.us26, %g.exit4.us21
++ %i.4.03.us29 = phi i16 [ %i.4.02.us22, %bb5.us26 ], [ %i.4.02.us22, %g.exit4.us21 ]
++ %_tmp49.us30 = add nuw nsw i16 %i.4.03.us29, 1
++ br label %bb4.us4
++
++bb4.us.us: ; preds = %bb2.split.us.us, %bb6.us.us
++ %i.4.01.us.us = phi i16 [ %_tmp49.us.us, %bb6.us.us ]
++ br label %bb1.i.us.us
++
++bb1.i.us.us: ; preds = %bb4.us.us
++ br label %g.exit4.us.us
++
++g.exit4.us.us: ; preds = %bb1.i.us.us, %g.exit4.critedge.us.us
++ %i.4.02.us.us = phi i16 [ %i.4.01.us.us, %bb1.i.us.us ]
++ br label %bb5.us.us
++
++bb5.us.us: ; preds = %g.exit4.us.us
++ br label %bb6.us.us
++
++bb6.us.us: ; preds = %bb5.us.us, %g.exit4.us.us
++ %i.4.03.us.us = phi i16 [ %i.4.02.us.us, %bb5.us.us ]
++ %_tmp49.us.us = add nuw nsw i16 %i.4.03.us.us, 1
++ br label %bb4.us.us
++
++
++.split: ; preds = %..split_crit_edge
++ br label %bb2
++
++bb2: ; preds = %.split, %bb7
++ %h.3.0 = phi i16 [ undef, %.split ], [ %_tmp53, %bb7 ]
++ br label %bb2.bb2.split_crit_edge
++
++bb2.bb2.split_crit_edge: ; preds = %bb2
++ br label %bb2.split
++
++bb2.split.us: ; preds = %bb2
++ br label %bb4.us
++
++bb4.us: ; preds = %bb6.us, %bb2.split.us
++ %i.4.01.us = phi i16 [ 0, %bb2.split.us ]
++ br label %bb1.i.us
++
++g.exit4.critedge.us: ; preds = %bb4.us
++ br label %g.exit4.us
++
++bb1.i.us: ; preds = %bb4.us
++ br label %g.exit4.us
++
++g.exit4.us: ; preds = %bb1.i.us, %g.exit4.critedge.us
++ %i.4.02.us = phi i16 [ %i.4.01.us, %g.exit4.critedge.us ], [ %i.4.01.us, %bb1.i.us ]
++ br label %bb5.us
++
++bb5.us: ; preds = %g.exit4.us
++ br label %bb7
++
++bb2.split: ; preds = %bb2.bb2.split_crit_edge
++ br label %bb4
++
++bb4: ; preds = %bb2.split, %bb6
++ %i.4.01 = phi i16 [ 0, %bb2.split ]
++ %_tmp16 = getelementptr [1 x [1 x %rec9]], [1 x [1 x %rec9]]* @a, i16 0, i16 %h.3.0, i16 %i.4.01, i32 0
++ %_tmp17 = load i16, i16* %_tmp16, align 1
++ br label %g.exit4.critedge
++
++bb1.i: ; preds = %bb4
++ br label %g.exit4
++
++g.exit4.critedge: ; preds = %bb4
++ %_tmp28.c = getelementptr [1 x [1 x %rec9]], [1 x [1 x %rec9]]* @a, i16 0, i16 %h.3.0, i16 %i.4.01, i32 1
++ %_tmp29.c = load i32, i32* %_tmp28.c, align 1
++ %_tmp30.c = trunc i32 %_tmp29.c to i16
++ br label %g.exit4
++
++g.exit4: ; preds = %g.exit4.critedge, %bb1.i
++ %i.4.02 = phi i16 [ %i.4.01, %g.exit4.critedge ], [ %i.4.01, %bb1.i ]
++ %_tmp41 = getelementptr [1 x [1 x %rec9]], [1 x [1 x %rec9]]* @a, i16 0, i16 %h.3.0, i16 %i.4.02, i32 2
++ br label %bb6
++
++bb5: ; preds = %g.exit4
++ br label %bb6
++
++bb6: ; preds = %bb5, %g.exit4
++ %i.4.03 = phi i16 [ %i.4.02, %bb5 ], [ %i.4.02, %g.exit4 ]
++ %_tmp49 = add nuw nsw i16 %i.4.03, 1
++ br label %bb7
++
++bb7: ; preds = %bb7.us-lcssa.us, %bb7.us-lcssa
++ %_tmp53 = add nsw i16 %h.3.0, 1
++ br label %bb2
++}
+--
+2.24.0
+
diff --git a/projects/rust/43909.patch b/projects/rust/43909.patch
new file mode 100644
index 0000000..78d2a75
--- /dev/null
+++ b/projects/rust/43909.patch
@@ -0,0 +1,252 @@
+From c95310f2d4fd3c88241c3b5d6dbf6251d34a3256 Mon Sep 17 00:00:00 2001
+From: Nikita Popov <nikita.ppv(a)gmail.com>
+Date: Sat, 16 Nov 2019 16:22:18 +0100
+Subject: [PATCH] Restructure caching
+
+Variant on D70103. The caching is switched to always use a BB to
+cache entry map, which then contains per-value caches. A separate
+set contains value handles with a deletion callback. This allows us
+to properly invalidate overdefined values.
+
+A possible alternative would be to always cache by value first and
+have per-BB maps/sets in the each cache entry. In that case we could
+use a ValueMap and would avoid the separate value handle set. I went
+with the BB indexing at the top level to make it easier to integrate
+D69914, but possibly that's not the right choice.
+
+Differential Revision: https://reviews.llvm.org/D70376
+
+diff --git a/llvm/lib/Analysis/LazyValueInfo.cpp b/llvm/lib/Analysis/LazyValueInfo.cpp
+index 110c085d3f3..aa6862cb588 100644
+--- a/llvm/lib/Analysis/LazyValueInfo.cpp
++++ b/llvm/lib/Analysis/LazyValueInfo.cpp
+@@ -133,12 +133,9 @@ namespace {
+ /// A callback value handle updates the cache when values are erased.
+ class LazyValueInfoCache;
+ struct LVIValueHandle final : public CallbackVH {
+- // Needs to access getValPtr(), which is protected.
+- friend struct DenseMapInfo<LVIValueHandle>;
+-
+ LazyValueInfoCache *Parent;
+
+- LVIValueHandle(Value *V, LazyValueInfoCache *P)
++ LVIValueHandle(Value *V, LazyValueInfoCache *P = nullptr)
+ : CallbackVH(V), Parent(P) { }
+
+ void deleted() override;
+@@ -152,89 +149,63 @@ namespace {
+ /// This is the cache kept by LazyValueInfo which
+ /// maintains information about queries across the clients' queries.
+ class LazyValueInfoCache {
+- /// This is all of the cached block information for exactly one Value*.
+- /// The entries are sorted by the BasicBlock* of the
+- /// entries, allowing us to do a lookup with a binary search.
+- /// Over-defined lattice values are recorded in OverDefinedCache to reduce
+- /// memory overhead.
+- struct ValueCacheEntryTy {
+- ValueCacheEntryTy(Value *V, LazyValueInfoCache *P) : Handle(V, P) {}
+- LVIValueHandle Handle;
+- SmallDenseMap<PoisoningVH<BasicBlock>, ValueLatticeElement, 4> BlockVals;
++ /// This is all of the cached information for one basic block. It contains
++ /// the per-value lattice elements, as well as a separate set for
++ /// overdefined values to reduce memory usage.
++ struct BlockCacheEntryTy {
++ SmallDenseMap<AssertingVH<Value>, ValueLatticeElement, 4> LatticeElements;
++ SmallDenseSet<AssertingVH<Value>, 4> OverDefined;
+ };
+
+- /// This tracks, on a per-block basis, the set of values that are
+- /// over-defined at the end of that block.
+- typedef DenseMap<PoisoningVH<BasicBlock>, SmallPtrSet<Value *, 4>>
+- OverDefinedCacheTy;
+- /// Keep track of all blocks that we have ever seen, so we
+- /// don't spend time removing unused blocks from our caches.
+- DenseSet<PoisoningVH<BasicBlock> > SeenBlocks;
+-
+- /// This is all of the cached information for all values,
+- /// mapped from Value* to key information.
+- DenseMap<Value *, std::unique_ptr<ValueCacheEntryTy>> ValueCache;
+- OverDefinedCacheTy OverDefinedCache;
+-
++ /// Cached information per basic block.
++ DenseMap<PoisoningVH<BasicBlock>, BlockCacheEntryTy> BlockCache;
++ /// Set of value handles used to erase values from the cache on deletion.
++ DenseSet<LVIValueHandle, DenseMapInfo<Value *>> ValueHandles;
+
+ public:
+ void insertResult(Value *Val, BasicBlock *BB,
+ const ValueLatticeElement &Result) {
+- SeenBlocks.insert(BB);
+-
++ auto &CacheEntry = BlockCache.try_emplace(BB).first->second;
+ // Insert over-defined values into their own cache to reduce memory
+ // overhead.
+ if (Result.isOverdefined())
+- OverDefinedCache[BB].insert(Val);
+- else {
+- auto It = ValueCache.find_as(Val);
+- if (It == ValueCache.end()) {
+- ValueCache[Val] = make_unique<ValueCacheEntryTy>(Val, this);
+- It = ValueCache.find_as(Val);
+- assert(It != ValueCache.end() && "Val was just added to the map!");
+- }
+- It->second->BlockVals[BB] = Result;
+- }
+- }
+-
+- bool isOverdefined(Value *V, BasicBlock *BB) const {
+- auto ODI = OverDefinedCache.find(BB);
+-
+- if (ODI == OverDefinedCache.end())
+- return false;
++ CacheEntry.OverDefined.insert(Val);
++ else
++ CacheEntry.LatticeElements.insert({ Val, Result });
+
+- return ODI->second.count(V);
++ auto HandleIt = ValueHandles.find_as(Val);
++ if (HandleIt == ValueHandles.end())
++ ValueHandles.insert({ Val, this });
+ }
+
+ bool hasCachedValueInfo(Value *V, BasicBlock *BB) const {
+- if (isOverdefined(V, BB))
+- return true;
+-
+- auto I = ValueCache.find_as(V);
+- if (I == ValueCache.end())
++ auto It = BlockCache.find(BB);
++ if (It == BlockCache.end())
+ return false;
+
+- return I->second->BlockVals.count(BB);
++ return It->second.OverDefined.count(V) ||
++ It->second.LatticeElements.count(V);
+ }
+
+ ValueLatticeElement getCachedValueInfo(Value *V, BasicBlock *BB) const {
+- if (isOverdefined(V, BB))
++ auto It = BlockCache.find(BB);
++ if (It == BlockCache.end())
++ return ValueLatticeElement();
++
++ if (It->second.OverDefined.count(V))
+ return ValueLatticeElement::getOverdefined();
+
+- auto I = ValueCache.find_as(V);
+- if (I == ValueCache.end())
++ auto LatticeIt = It->second.LatticeElements.find(V);
++ if (LatticeIt == It->second.LatticeElements.end())
+ return ValueLatticeElement();
+- auto BBI = I->second->BlockVals.find(BB);
+- if (BBI == I->second->BlockVals.end())
+- return ValueLatticeElement();
+- return BBI->second;
++
++ return LatticeIt->second;
+ }
+
+ /// clear - Empty the cache.
+ void clear() {
+- SeenBlocks.clear();
+- ValueCache.clear();
+- OverDefinedCache.clear();
++ BlockCache.clear();
++ ValueHandles.clear();
+ }
+
+ /// Inform the cache that a given value has been deleted.
+@@ -248,23 +219,18 @@ namespace {
+ /// OldSucc might have (unless also overdefined in NewSucc). This just
+ /// flushes elements from the cache and does not add any.
+ void threadEdgeImpl(BasicBlock *OldSucc,BasicBlock *NewSucc);
+-
+- friend struct LVIValueHandle;
+ };
+ }
+
+ void LazyValueInfoCache::eraseValue(Value *V) {
+- for (auto I = OverDefinedCache.begin(), E = OverDefinedCache.end(); I != E;) {
+- // Copy and increment the iterator immediately so we can erase behind
+- // ourselves.
+- auto Iter = I++;
+- SmallPtrSetImpl<Value *> &ValueSet = Iter->second;
+- ValueSet.erase(V);
+- if (ValueSet.empty())
+- OverDefinedCache.erase(Iter);
++ for (auto &Pair : BlockCache) {
++ Pair.second.LatticeElements.erase(V);
++ Pair.second.OverDefined.erase(V);
+ }
+
+- ValueCache.erase(V);
++ auto HandleIt = ValueHandles.find_as(V);
++ if (HandleIt != ValueHandles.end())
++ ValueHandles.erase(HandleIt);
+ }
+
+ void LVIValueHandle::deleted() {
+@@ -274,18 +240,7 @@ void LVIValueHandle::deleted() {
+ }
+
+ void LazyValueInfoCache::eraseBlock(BasicBlock *BB) {
+- // Shortcut if we have never seen this block.
+- DenseSet<PoisoningVH<BasicBlock> >::iterator I = SeenBlocks.find(BB);
+- if (I == SeenBlocks.end())
+- return;
+- SeenBlocks.erase(I);
+-
+- auto ODI = OverDefinedCache.find(BB);
+- if (ODI != OverDefinedCache.end())
+- OverDefinedCache.erase(ODI);
+-
+- for (auto &I : ValueCache)
+- I.second->BlockVals.erase(BB);
++ BlockCache.erase(BB);
+ }
+
+ void LazyValueInfoCache::threadEdgeImpl(BasicBlock *OldSucc,
+@@ -303,10 +258,11 @@ void LazyValueInfoCache::threadEdgeImpl(BasicBlock *OldSucc,
+ std::vector<BasicBlock*> worklist;
+ worklist.push_back(OldSucc);
+
+- auto I = OverDefinedCache.find(OldSucc);
+- if (I == OverDefinedCache.end())
++ auto I = BlockCache.find(OldSucc);
++ if (I == BlockCache.end() || I->second.OverDefined.empty())
+ return; // Nothing to process here.
+- SmallVector<Value *, 4> ValsToClear(I->second.begin(), I->second.end());
++ SmallVector<Value *, 4> ValsToClear(I->second.OverDefined.begin(),
++ I->second.OverDefined.end());
+
+ // Use a worklist to perform a depth-first search of OldSucc's successors.
+ // NOTE: We do not need a visited list since any blocks we have already
+@@ -320,10 +276,10 @@ void LazyValueInfoCache::threadEdgeImpl(BasicBlock *OldSucc,
+ if (ToUpdate == NewSucc) continue;
+
+ // If a value was marked overdefined in OldSucc, and is here too...
+- auto OI = OverDefinedCache.find(ToUpdate);
+- if (OI == OverDefinedCache.end())
++ auto OI = BlockCache.find(ToUpdate);
++ if (OI == BlockCache.end() || OI->second.OverDefined.empty())
+ continue;
+- SmallPtrSetImpl<Value *> &ValueSet = OI->second;
++ auto &ValueSet = OI->second.OverDefined;
+
+ bool changed = false;
+ for (Value *V : ValsToClear) {
+@@ -333,11 +289,6 @@ void LazyValueInfoCache::threadEdgeImpl(BasicBlock *OldSucc,
+ // If we removed anything, then we potentially need to update
+ // blocks successors too.
+ changed = true;
+-
+- if (ValueSet.empty()) {
+- OverDefinedCache.erase(OI);
+- break;
+- }
+ }
+
+ if (!changed) continue;
+--
+2.24.0
+
diff --git a/projects/rust/build b/projects/rust/build
index 9a6b54a..8b45e3f 100644
--- a/projects/rust/build
+++ b/projects/rust/build
@@ -51,6 +51,13 @@ mkdir /var/tmp/build
tar -C /var/tmp/build -xf [% c('input_files_by_name/rust') %]
cd /var/tmp/build/rustc-[% c('version') %]-src
+# LLVM has reproducibility issues when optimizing bitcode, which we need to
+# patch. See: #32053 for more details.
+cd src/llvm-project
+patch -p1 < $rootdir/42574.patch
+patch -p1 < $rootdir/43909.patch
+cd ../../
+
[% IF c("var/windows-i686") %]
# Cross-compiling for Windows 32bit is currently not possible without any
# patches. The reason for that is libstd expecting DWARF unwinding while most
diff --git a/projects/rust/config b/projects/rust/config
index 03d7be0..848ccd0 100644
--- a/projects/rust/config
+++ b/projects/rust/config
@@ -106,3 +106,5 @@ input_files:
gpg_keyring: rust.gpg
- filename: unwind.patch
enable: '[% c("var/windows-i686") %]'
+ - filename: 42574.patch
+ - filename: 43909.patch
1
0