Skip to content

Commit ea6fa9c

Browse files
committed
Merge remote-tracking branch 'upstream/release/16.x' into rustc/16.0-2023-04-05
2 parents 585a6eb + 18ddebe commit ea6fa9c

File tree

25 files changed

+854
-177
lines changed

25 files changed

+854
-177
lines changed
+113
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
name: Release Binaries
2+
3+
on:
4+
push:
5+
tags:
6+
- 'llvmorg-*'
7+
workflow_dispatch:
8+
inputs:
9+
upload:
10+
description: 'Upload binaries to the release page'
11+
required: true
12+
default: true
13+
type: boolean
14+
tag:
15+
description: 'Tag to build'
16+
required: true
17+
type: string
18+
19+
permissions:
20+
contents: read # Default everything to read-only
21+
22+
jobs:
23+
prepare:
24+
name: Prepare to build binaries
25+
runs-on: ubuntu-22.04
26+
if: github.repository == 'llvm/llvm-project'
27+
outputs:
28+
release-version: ${{ steps.validate-tag.outputs.release-version }}
29+
release: ${{ steps.validate-tag.outputs.release }}
30+
build-dir: ${{ steps.validate-tag.outputs.build-dir }}
31+
rc-flags: ${{ steps.validate-tag.outputs.rc-flags }}
32+
ref: ${{ steps.validate-tag.outputs.ref }}
33+
34+
steps:
35+
- name: Checkout LLVM
36+
uses: actions/checkout@v3
37+
38+
- name: Validate and parse tag
39+
id: validate-tag
40+
# In order for the test-release.sh script to run correctly, the LLVM
41+
# source needs to be at the following location relative to the build dir:
42+
# | X.Y.Z-rcN | ./rcN/llvm-project
43+
# | X.Y.Z | ./final/llvm-project
44+
#
45+
# We also need to set divergent flags based on the release version:
46+
# | X.Y.Z-rcN | -rc N -test-asserts
47+
# | X.Y.Z | -final
48+
run: |
49+
tag="${{ github.ref_name }}"
50+
trimmed=`echo ${{ inputs.tag }} | xargs`
51+
[[ "$trimmed" != "" ]] && tag="$trimmed"
52+
if [ -n "${{ inputs.upload }}" ]; then
53+
upload="${{ inputs.upload }}"
54+
else
55+
upload="true"
56+
fi
57+
bash .github/workflows/set-release-binary-outputs.sh "${{ github.actor }}" "$tag" "$upload"
58+
59+
build-binaries:
60+
name: ${{ matrix.target.triple }}
61+
permissions:
62+
contents: write # To upload assets to release.
63+
needs: prepare
64+
runs-on: ${{ matrix.target.runs-on }}
65+
strategy:
66+
fail-fast: false
67+
matrix:
68+
target:
69+
- triple: x86_64-linux-gnu-ubuntu-22.04
70+
runs-on: ubuntu-22.04-8x32
71+
debian-build-deps: >
72+
chrpath
73+
gcc-multilib
74+
ninja-build
75+
76+
steps:
77+
- name: Checkout LLVM
78+
uses: actions/checkout@v3
79+
with:
80+
ref: ${{ needs.prepare.outputs.ref }}
81+
path: ${{ needs.prepare.outputs.build-dir }}/llvm-project
82+
83+
- name: Install Brew build dependencies
84+
if: matrix.target.brew-build-deps != ''
85+
run: brew install ${{ matrix.target.brew-build-deps }}
86+
87+
- name: Install Debian build dependencies
88+
if: matrix.target.debian-build-deps != ''
89+
run: sudo apt install ${{ matrix.target.debian-build-deps }}
90+
91+
- name: Set macOS build env variables
92+
if: runner.os == 'macOS'
93+
run: |
94+
echo "MACOSX_DEPLOYMENT_TARGET=10.9" >> $GITHUB_ENV
95+
96+
- name: Build and test release
97+
run: |
98+
${{ needs.prepare.outputs.build-dir }}/llvm-project/llvm/utils/release/test-release.sh \
99+
-release ${{ needs.prepare.outputs.release }} \
100+
${{ needs.prepare.outputs.rc-flags }} \
101+
-triple ${{ matrix.target.triple }} \
102+
-use-ninja \
103+
-no-checkout \
104+
-no-test-suite
105+
106+
- name: Upload binaries
107+
if: ${{ always() && needs.prepare.outputs.upload == 'true' }}
108+
run: |
109+
${{ needs.prepare.outputs.build-dir }}/llvm-project/llvm/utils/release/github-upload-release.py \
110+
--token ${{ github.token }} \
111+
--release ${{ needs.prepare.outputs.release-version }} \
112+
upload \
113+
--files ${{ needs.prepare.outputs.build-dir }}/clang+llvm-${{ needs.prepare.outputs.release-version }}-${{ matrix.target.triple }}.tar.xz
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# Usage: set-release-binary-outputs.sh <github_user> <tag> <upload>
2+
3+
set -e
4+
5+
if [ -z "$GITHUB_OUTPUT" ]; then
6+
export GITHUB_OUTPUT=`mktemp`
7+
echo "Warning: Environment variable GITHUB_OUTPUT is not set."
8+
echo "Writing output variables to $GITHUB_OUTPUT"
9+
fi
10+
11+
github_user=$1
12+
tag=$2
13+
upload=$3
14+
15+
if [[ "$github_user" != "tstellar" && "$github_user" != "tru" ]]; then
16+
echo "ERROR: User not allowed: $github_user"
17+
exit 1
18+
fi
19+
pattern='^llvmorg-[0-9]\+\.[0-9]\+\.[0-9]\+\(-rc[0-9]\+\)\?$'
20+
echo "$tag" | grep -e $pattern
21+
if [ $? != 0 ]; then
22+
echo "ERROR: Tag '$tag' doesn't match pattern: $pattern"
23+
exit 1
24+
fi
25+
release_version=`echo "$tag" | sed 's/llvmorg-//g'`
26+
release=`echo "$release_version" | sed 's/-.*//g'`
27+
build_dir=`echo "$release_version" | sed 's,^[^-]\+,final,' | sed 's,[^-]\+-rc\(.\+\),rc\1,'`
28+
rc_flags=`echo "$release_version" | sed 's,^[^-]\+,-final,' | sed 's,[^-]\+-rc\(.\+\),-rc \1 -test-asserts,' | sed 's,--,-,'`
29+
echo "release-version=$release_version" >> $GITHUB_OUTPUT
30+
echo "release=$release" >> $GITHUB_OUTPUT
31+
echo "build-dir=$build_dir" >> $GITHUB_OUTPUT
32+
echo "rc-flags=$rc_flags" >> $GITHUB_OUTPUT
33+
echo "upload=$upload" >> $GITHUB_OUTPUT
34+
echo "ref=$tag" >> $GITHUB_OUTPUT

clang/lib/Format/Format.cpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -721,23 +721,23 @@ template <> struct MappingTraits<FormatStyle::TrailingCommentsAlignmentStyle> {
721721
FormatStyle::TrailingCommentsAlignmentStyle &Value) {
722722
IO.enumCase(Value, "Leave",
723723
FormatStyle::TrailingCommentsAlignmentStyle(
724-
{FormatStyle::TCAS_Leave, 1}));
724+
{FormatStyle::TCAS_Leave, 0}));
725725

726726
IO.enumCase(Value, "Always",
727727
FormatStyle::TrailingCommentsAlignmentStyle(
728-
{FormatStyle::TCAS_Always, 1}));
728+
{FormatStyle::TCAS_Always, 0}));
729729

730730
IO.enumCase(Value, "Never",
731731
FormatStyle::TrailingCommentsAlignmentStyle(
732-
{FormatStyle::TCAS_Never, 1}));
732+
{FormatStyle::TCAS_Never, 0}));
733733

734734
// For backwards compatibility
735735
IO.enumCase(Value, "true",
736736
FormatStyle::TrailingCommentsAlignmentStyle(
737-
{FormatStyle::TCAS_Always, 1}));
737+
{FormatStyle::TCAS_Always, 0}));
738738
IO.enumCase(Value, "false",
739739
FormatStyle::TrailingCommentsAlignmentStyle(
740-
{FormatStyle::TCAS_Never, 1}));
740+
{FormatStyle::TCAS_Never, 0}));
741741
}
742742

743743
static void mapping(IO &IO,

clang/lib/Format/TokenAnnotator.cpp

+1-8
Original file line numberDiff line numberDiff line change
@@ -399,8 +399,7 @@ class AnnotatingParser {
399399
FormatToken *Next = CurrentToken->Next;
400400
if (PrevPrev && PrevPrev->is(tok::identifier) &&
401401
Prev->isOneOf(tok::star, tok::amp, tok::ampamp) &&
402-
CurrentToken->is(tok::identifier) &&
403-
!Next->isOneOf(tok::equal, tok::l_brace)) {
402+
CurrentToken->is(tok::identifier) && Next->isNot(tok::equal)) {
404403
Prev->setType(TT_BinaryOperator);
405404
LookForDecls = false;
406405
}
@@ -2399,12 +2398,6 @@ class AnnotatingParser {
23992398
return TT_PointerOrReference;
24002399
}
24012400

2402-
// if (Class* obj { function() })
2403-
if (PrevToken->Tok.isAnyIdentifier() && NextToken->Tok.isAnyIdentifier() &&
2404-
NextToken->Next && NextToken->Next->is(tok::l_brace)) {
2405-
return TT_PointerOrReference;
2406-
}
2407-
24082401
if (PrevToken->endsSequence(tok::r_square, tok::l_square, tok::kw_delete))
24092402
return TT_UnaryOperator;
24102403

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// RUN: %clang_cc1 -triple aarch64-eabi -target-feature +v8a -verify -S %s -o -
2+
// REQUIRES: aarch64-registered-target
3+
4+
#include <arm_neon.h>
5+
6+
__attribute__((target("+crypto")))
7+
void test_crypto(uint8x16_t data, uint8x16_t key)
8+
{
9+
vaeseq_u8(data, key);
10+
vsha1su1q_u32(data, key);
11+
}
12+
13+
__attribute__((target("crypto")))
14+
void test_pluscrypto(uint8x16_t data, uint8x16_t key)
15+
{
16+
vaeseq_u8(data, key);
17+
vsha1su1q_u32(data, key);
18+
}
19+
20+
__attribute__((target("arch=armv8.2-a+crypto")))
21+
void test_archcrypto(uint8x16_t data, uint8x16_t key)
22+
{
23+
vaeseq_u8(data, key);
24+
vsha1su1q_u32(data, key);
25+
}
26+
27+
// FIXME: This shouldn't need +crypto to be consistent with -mcpu options.
28+
__attribute__((target("cpu=cortex-a55+crypto")))
29+
void test_a55crypto(uint8x16_t data, uint8x16_t key)
30+
{
31+
vaeseq_u8(data, key);
32+
vsha1su1q_u32(data, key);
33+
}
34+
35+
__attribute__((target("cpu=cortex-a510+crypto")))
36+
void test_a510crypto(uint8x16_t data, uint8x16_t key)
37+
{
38+
vaeseq_u8(data, key);
39+
vsha1su1q_u32(data, key);
40+
}
41+
42+
__attribute__((target("+sha2+aes")))
43+
void test_sha2aes(uint8x16_t data, uint8x16_t key)
44+
{
45+
vaeseq_u8(data, key);
46+
vsha1su1q_u32(data, key);
47+
}
48+
49+
void test_errors(uint8x16_t data, uint8x16_t key)
50+
{
51+
vaeseq_u8(data, key); // expected-error {{always_inline function 'vaeseq_u8' requires target feature 'aes'}}
52+
vsha1su1q_u32(data, key); // expected-error {{always_inline function 'vsha1su1q_u32' requires target feature 'sha2'}}
53+
}

clang/tools/clang-linker-wrapper/CMakeLists.txt

+1-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
include(GNUInstallDirs)
2-
31
set(LLVM_LINK_COMPONENTS
42
${LLVM_TARGETS_TO_BUILD}
53
BitWriter
@@ -27,7 +25,7 @@ if(NOT CLANG_BUILT_STANDALONE)
2725
set(tablegen_deps intrinsics_gen LinkerWrapperOpts)
2826
endif()
2927

30-
add_clang_executable(clang-linker-wrapper
28+
add_clang_tool(clang-linker-wrapper
3129
ClangLinkerWrapper.cpp
3230
OffloadWrapper.cpp
3331

@@ -45,5 +43,3 @@ target_link_libraries(clang-linker-wrapper
4543
PRIVATE
4644
${CLANG_LINKER_WRAPPER_LIB_DEPS}
4745
)
48-
49-
install(TARGETS clang-linker-wrapper RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")

clang/unittests/Format/ConfigParseTest.cpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -468,20 +468,20 @@ TEST(ConfigParseTest, ParsesConfiguration) {
468468

469469
CHECK_PARSE("AlignTrailingComments: Leave", AlignTrailingComments,
470470
FormatStyle::TrailingCommentsAlignmentStyle(
471-
{FormatStyle::TCAS_Leave, 1}));
471+
{FormatStyle::TCAS_Leave, 0}));
472472
CHECK_PARSE("AlignTrailingComments: Always", AlignTrailingComments,
473473
FormatStyle::TrailingCommentsAlignmentStyle(
474-
{FormatStyle::TCAS_Always, 1}));
474+
{FormatStyle::TCAS_Always, 0}));
475475
CHECK_PARSE("AlignTrailingComments: Never", AlignTrailingComments,
476476
FormatStyle::TrailingCommentsAlignmentStyle(
477-
{FormatStyle::TCAS_Never, 1}));
477+
{FormatStyle::TCAS_Never, 0}));
478478
// For backwards compatibility
479479
CHECK_PARSE("AlignTrailingComments: true", AlignTrailingComments,
480480
FormatStyle::TrailingCommentsAlignmentStyle(
481-
{FormatStyle::TCAS_Always, 1}));
481+
{FormatStyle::TCAS_Always, 0}));
482482
CHECK_PARSE("AlignTrailingComments: false", AlignTrailingComments,
483483
FormatStyle::TrailingCommentsAlignmentStyle(
484-
{FormatStyle::TCAS_Never, 1}));
484+
{FormatStyle::TCAS_Never, 0}));
485485
CHECK_PARSE_NESTED_VALUE("Kind: Always", AlignTrailingComments, Kind,
486486
FormatStyle::TCAS_Always);
487487
CHECK_PARSE_NESTED_VALUE("Kind: Never", AlignTrailingComments, Kind,

clang/unittests/Format/TokenAnnotatorTest.cpp

-12
Original file line numberDiff line numberDiff line change
@@ -146,18 +146,6 @@ TEST_F(TokenAnnotatorTest, UnderstandsUsesOfStarAndAmp) {
146146
EXPECT_TOKEN(Tokens[7], tok::star, TT_UnaryOperator);
147147
EXPECT_TOKEN(Tokens[12], tok::star, TT_PointerOrReference);
148148

149-
Tokens = annotate("if (Foo * Bar / Test)");
150-
ASSERT_EQ(Tokens.size(), 9u) << Tokens;
151-
EXPECT_TOKEN(Tokens[3], tok::star, TT_BinaryOperator);
152-
153-
Tokens = annotate("if (Class* obj {getObj()})");
154-
ASSERT_EQ(Tokens.size(), 12u) << Tokens;
155-
EXPECT_TOKEN(Tokens[3], tok::star, TT_PointerOrReference);
156-
157-
Tokens = annotate("if (Foo* Bar = getObj())");
158-
ASSERT_EQ(Tokens.size(), 11u) << Tokens;
159-
EXPECT_TOKEN(Tokens[3], tok::star, TT_PointerOrReference);
160-
161149
Tokens = annotate("int f3() { return sizeof(Foo&); }");
162150
ASSERT_EQ(Tokens.size(), 14u) << Tokens;
163151
EXPECT_TOKEN(Tokens[9], tok::amp, TT_PointerOrReference);

compiler-rt/lib/asan/asan_interceptors.cpp

+34-13
Original file line numberDiff line numberDiff line change
@@ -257,12 +257,36 @@ static void ClearShadowMemoryForContextStack(uptr stack, uptr ssize) {
257257
PoisonShadow(bottom, ssize, 0);
258258
}
259259

260-
INTERCEPTOR(int, getcontext, struct ucontext_t *ucp) {
261-
// API does not requires to have ucp clean, and sets only part of fields. We
262-
// use ucp->uc_stack to unpoison new stack. We prefer to have zeroes then
263-
// uninitialized bytes.
264-
ResetContextStack(ucp);
265-
return REAL(getcontext)(ucp);
260+
INTERCEPTOR(void, makecontext, struct ucontext_t *ucp, void (*func)(), int argc,
261+
...) {
262+
va_list ap;
263+
uptr args[64];
264+
// We don't know a better way to forward ... into REAL function. We can
265+
// increase args size if neccecary.
266+
CHECK_LE(argc, ARRAY_SIZE(args));
267+
internal_memset(args, 0, sizeof(args));
268+
va_start(ap, argc);
269+
for (int i = 0; i < argc; ++i) args[i] = va_arg(ap, uptr);
270+
va_end(ap);
271+
272+
# define ENUMERATE_ARRAY_4(start) \
273+
args[start], args[start + 1], args[start + 2], args[start + 3]
274+
# define ENUMERATE_ARRAY_16(start) \
275+
ENUMERATE_ARRAY_4(start), ENUMERATE_ARRAY_4(start + 4), \
276+
ENUMERATE_ARRAY_4(start + 8), ENUMERATE_ARRAY_4(start + 12)
277+
# define ENUMERATE_ARRAY_64() \
278+
ENUMERATE_ARRAY_16(0), ENUMERATE_ARRAY_16(16), ENUMERATE_ARRAY_16(32), \
279+
ENUMERATE_ARRAY_16(48)
280+
281+
REAL(makecontext)
282+
((struct ucontext_t *)ucp, func, argc, ENUMERATE_ARRAY_64());
283+
284+
# undef ENUMERATE_ARRAY_4
285+
# undef ENUMERATE_ARRAY_16
286+
# undef ENUMERATE_ARRAY_64
287+
288+
// Sign the stack so we can identify it for unpoisoning.
289+
SignContextStack(ucp);
266290
}
267291

268292
INTERCEPTOR(int, swapcontext, struct ucontext_t *oucp,
@@ -279,9 +303,6 @@ INTERCEPTOR(int, swapcontext, struct ucontext_t *oucp,
279303
ReadContextStack(ucp, &stack, &ssize);
280304
ClearShadowMemoryForContextStack(stack, ssize);
281305

282-
// See getcontext interceptor.
283-
ResetContextStack(oucp);
284-
285306
# if __has_attribute(__indirect_return__) && \
286307
(defined(__x86_64__) || defined(__i386__))
287308
int (*real_swapcontext)(struct ucontext_t *, struct ucontext_t *)
@@ -658,11 +679,11 @@ void InitializeAsanInterceptors() {
658679
// Intecept jump-related functions.
659680
ASAN_INTERCEPT_FUNC(longjmp);
660681

661-
#if ASAN_INTERCEPT_SWAPCONTEXT
662-
ASAN_INTERCEPT_FUNC(getcontext);
682+
# if ASAN_INTERCEPT_SWAPCONTEXT
663683
ASAN_INTERCEPT_FUNC(swapcontext);
664-
#endif
665-
#if ASAN_INTERCEPT__LONGJMP
684+
ASAN_INTERCEPT_FUNC(makecontext);
685+
# endif
686+
# if ASAN_INTERCEPT__LONGJMP
666687
ASAN_INTERCEPT_FUNC(_longjmp);
667688
#endif
668689
#if ASAN_INTERCEPT___LONGJMP_CHK

compiler-rt/lib/asan/asan_internal.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,8 @@ void AsanApplyToGlobals(globals_op_fptr op, const void *needle);
105105

106106
void AsanOnDeadlySignal(int, void *siginfo, void *context);
107107

108+
void SignContextStack(void *context);
108109
void ReadContextStack(void *context, uptr *stack, uptr *ssize);
109-
void ResetContextStack(void *context);
110110
void StopInitOrderChecking();
111111

112112
// Wrapper for TLS/TSD.

0 commit comments

Comments
 (0)