Skip to content

Commit edc5fb2

Browse files
committed
Merge branch 'main' of github.com:llvm/llvm-project into loop-vectorize/not-into-cmp-all-fold
2 parents 8073742 + d6679d5 commit edc5fb2

File tree

705 files changed

+39380
-23122
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

705 files changed

+39380
-23122
lines changed

bolt/include/bolt/Core/BinaryFunction.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1196,11 +1196,6 @@ class BinaryFunction {
11961196
return getSecondaryEntryPointSymbol(BB.getLabel());
11971197
}
11981198

1199-
/// Remove a label from the secondary entry point map.
1200-
void removeSymbolFromSecondaryEntryPointMap(const MCSymbol *Label) {
1201-
SecondaryEntryPoints.erase(Label);
1202-
}
1203-
12041199
/// Return true if the basic block is an entry point into the function
12051200
/// (either primary or secondary).
12061201
bool isEntryPoint(const BinaryBasicBlock &BB) const {

bolt/include/bolt/Rewrite/RewriteInstance.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ class RewriteInstance {
241241

242242
/// Adjust function sizes and set proper maximum size values after the whole
243243
/// symbol table has been processed.
244-
void adjustFunctionBoundaries();
244+
void adjustFunctionBoundaries(DenseMap<uint64_t, MarkerSymType> &MarkerSyms);
245245

246246
/// Make .eh_frame section relocatable.
247247
void relocateEHFrameSection();

bolt/lib/Core/BinaryFunction.cpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1915,13 +1915,9 @@ void BinaryFunction::postProcessEntryPoints() {
19151915
continue;
19161916

19171917
// If we have grabbed a wrong code label which actually points to some
1918-
// constant island inside the function, ignore this label and remove it
1919-
// from the secondary entry point map.
1920-
if (isStartOfConstantIsland(Offset)) {
1921-
BC.SymbolToFunctionMap.erase(Label);
1922-
removeSymbolFromSecondaryEntryPointMap(Label);
1918+
// constant island inside the function, ignore this label.
1919+
if (isStartOfConstantIsland(Offset))
19231920
continue;
1924-
}
19251921

19261922
BC.errs() << "BOLT-WARNING: reference in the middle of instruction "
19271923
"detected in function "

bolt/lib/Rewrite/RewriteInstance.cpp

Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -881,14 +881,9 @@ void RewriteInstance::discoverFileObjects() {
881881
// code section (see IHI0056B). $d identifies data contents.
882882
// Compilers usually merge multiple data objects in a single $d-$x interval,
883883
// but we need every data object to be marked with $d. Because of that we
884-
// create a vector of MarkerSyms with all locations of data objects.
884+
// keep track of marker symbols with all locations of data objects.
885885

886-
struct MarkerSym {
887-
uint64_t Address;
888-
MarkerSymType Type;
889-
};
890-
891-
std::vector<MarkerSym> SortedMarkerSymbols;
886+
DenseMap<uint64_t, MarkerSymType> MarkerSymbols;
892887
auto addExtraDataMarkerPerSymbol = [&]() {
893888
bool IsData = false;
894889
uint64_t LastAddr = 0;
@@ -912,14 +907,14 @@ void RewriteInstance::discoverFileObjects() {
912907
}
913908

914909
if (MarkerType != MarkerSymType::NONE) {
915-
SortedMarkerSymbols.push_back(MarkerSym{SymInfo.Address, MarkerType});
910+
MarkerSymbols[SymInfo.Address] = MarkerType;
916911
LastAddr = SymInfo.Address;
917912
IsData = MarkerType == MarkerSymType::DATA;
918913
continue;
919914
}
920915

921916
if (IsData) {
922-
SortedMarkerSymbols.push_back({SymInfo.Address, MarkerSymType::DATA});
917+
MarkerSymbols[SymInfo.Address] = MarkerSymType::DATA;
923918
LastAddr = SymInfo.Address;
924919
}
925920
}
@@ -1284,27 +1279,24 @@ void RewriteInstance::discoverFileObjects() {
12841279
BC->setHasSymbolsWithFileName(FileSymbols.size());
12851280

12861281
// Now that all the functions were created - adjust their boundaries.
1287-
adjustFunctionBoundaries();
1282+
adjustFunctionBoundaries(MarkerSymbols);
12881283

12891284
// Annotate functions with code/data markers in AArch64
1290-
for (auto ISym = SortedMarkerSymbols.begin();
1291-
ISym != SortedMarkerSymbols.end(); ++ISym) {
1292-
1293-
auto *BF =
1294-
BC->getBinaryFunctionContainingAddress(ISym->Address, true, true);
1285+
for (auto &[Address, Type] : MarkerSymbols) {
1286+
auto *BF = BC->getBinaryFunctionContainingAddress(Address, true, true);
12951287

12961288
if (!BF) {
12971289
// Stray marker
12981290
continue;
12991291
}
1300-
const auto EntryOffset = ISym->Address - BF->getAddress();
1301-
if (ISym->Type == MarkerSymType::CODE) {
1292+
const auto EntryOffset = Address - BF->getAddress();
1293+
if (Type == MarkerSymType::CODE) {
13021294
BF->markCodeAtOffset(EntryOffset);
13031295
continue;
13041296
}
1305-
if (ISym->Type == MarkerSymType::DATA) {
1297+
if (Type == MarkerSymType::DATA) {
13061298
BF->markDataAtOffset(EntryOffset);
1307-
BC->AddressToConstantIslandMap[ISym->Address] = BF;
1299+
BC->AddressToConstantIslandMap[Address] = BF;
13081300
continue;
13091301
}
13101302
llvm_unreachable("Unknown marker");
@@ -1833,7 +1825,8 @@ void RewriteInstance::disassemblePLT() {
18331825
}
18341826
}
18351827

1836-
void RewriteInstance::adjustFunctionBoundaries() {
1828+
void RewriteInstance::adjustFunctionBoundaries(
1829+
DenseMap<uint64_t, MarkerSymType> &MarkerSyms) {
18371830
for (auto BFI = BC->getBinaryFunctions().begin(),
18381831
BFE = BC->getBinaryFunctions().end();
18391832
BFI != BFE; ++BFI) {
@@ -1871,12 +1864,15 @@ void RewriteInstance::adjustFunctionBoundaries() {
18711864
continue;
18721865
}
18731866

1874-
// This is potentially another entry point into the function.
1875-
uint64_t EntryOffset = NextSymRefI->first - Function.getAddress();
1876-
LLVM_DEBUG(dbgs() << "BOLT-DEBUG: adding entry point to function "
1877-
<< Function << " at offset 0x"
1878-
<< Twine::utohexstr(EntryOffset) << '\n');
1879-
Function.addEntryPointAtOffset(EntryOffset);
1867+
auto It = MarkerSyms.find(NextSymRefI->first);
1868+
if (It == MarkerSyms.end() || It->second != MarkerSymType::DATA) {
1869+
// This is potentially another entry point into the function.
1870+
uint64_t EntryOffset = NextSymRefI->first - Function.getAddress();
1871+
LLVM_DEBUG(dbgs() << "BOLT-DEBUG: adding entry point to function "
1872+
<< Function << " at offset 0x"
1873+
<< Twine::utohexstr(EntryOffset) << '\n');
1874+
Function.addEntryPointAtOffset(EntryOffset);
1875+
}
18801876

18811877
++NextSymRefI;
18821878
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# This test is to ensure that we query data marker symbols to avoid
2+
# misidentifying constant data island symbol as extra entry point.
3+
4+
# RUN: %clang %cflags %s -o %t.so -Wl,-q -Wl,--init=_bar -Wl,--fini=_bar
5+
# RUN: llvm-bolt %t.so -o %t.instr.so
6+
7+
.text
8+
.global _start
9+
.type _start, %function
10+
_start:
11+
ret
12+
13+
.text
14+
.global _foo
15+
.type _foo, %function
16+
_foo:
17+
cbz x1, _foo_2
18+
_foo_1:
19+
add x1, x2, x0
20+
b _foo
21+
_foo_2:
22+
ret
23+
24+
# None of these constant island symbols should be identified as extra entry
25+
# point for function `_foo'.
26+
.align 4
27+
_const1: .short 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80
28+
_const2: .short 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, 0xa0
29+
_const3: .short 0x04, 0x08, 0x0c, 0x20, 0x60, 0x80, 0xa0, 0xc0
30+
31+
.text
32+
.global _bar
33+
.type _bar, %function
34+
_bar:
35+
ret
36+
37+
# Dummy relocation to force relocation mode
38+
.reloc 0, R_AARCH64_NONE

clang-tools-extra/clangd/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ add_subdirectory(support)
66

77
# Configure the Features.inc file.
88
if (NOT DEFINED CLANGD_BUILD_XPC)
9-
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
9+
if("${CMAKE_SYSTEM_NAME}" MATCHES "Darwin")
1010
set(CLANGD_BUILD_XPC_DEFAULT ON)
1111
else ()
1212
set(CLANGD_BUILD_XPC_DEFAULT OFF)
@@ -193,7 +193,7 @@ if(CLANGD_TIDY_CHECKS)
193193
endif()
194194

195195
add_subdirectory(refactor/tweaks)
196-
if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
196+
if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
197197
# FIXME: Make fuzzer not use linux-specific APIs, build it everywhere.
198198
add_subdirectory(fuzzer)
199199
endif()

clang-tools-extra/clangd/unittests/FindTargetTests.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -731,6 +731,12 @@ TEST_F(TargetDeclTest, BuiltinTemplates) {
731731
using type_pack_element = [[__type_pack_element]]<N, Pack...>;
732732
)cpp";
733733
EXPECT_DECLS("TemplateSpecializationTypeLoc", );
734+
735+
Code = R"cpp(
736+
template <template <class...> class Templ, class... Types>
737+
using dedup_types = Templ<[[__builtin_dedup_pack]]<Types...>...>;
738+
)cpp";
739+
EXPECT_DECLS("TemplateSpecializationTypeLoc", );
734740
}
735741

736742
TEST_F(TargetDeclTest, MemberOfTemplate) {

clang/bindings/python/tests/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ if(WIN32)
3535
endif()
3636

3737
# The Python FFI interface is broken on AIX: https://bugs.python.org/issue38628.
38-
if(${CMAKE_SYSTEM_NAME} MATCHES "AIX")
38+
if("${CMAKE_SYSTEM_NAME}" MATCHES "AIX")
3939
set(RUN_PYTHON_TESTS FALSE)
4040
endif()
4141

clang/docs/LanguageExtensions.rst

Lines changed: 74 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -635,11 +635,12 @@ C and C++. For example:
635635
return v;
636636
}
637637

638+
638639
Boolean vectors are a Clang extension of the ext vector type. Boolean vectors
639640
are intended, though not guaranteed, to map to vector mask registers. The size
640641
parameter of a boolean vector type is the number of bits in the vector. The
641642
boolean vector is dense and each bit in the boolean vector is one vector
642-
element.
643+
element. Query for this feature with ``__has_feature(ext_vector_type_boolean)``.
643644

644645
The semantics of boolean vectors borrows from C bit-fields with the following
645646
differences:
@@ -657,6 +658,16 @@ The size and alignment are both the number of bits rounded up to the next power
657658
of two, but the alignment is at most the maximum vector alignment of the
658659
target.
659660

661+
A boolean vector can be used in a ternary `?:` operator to select vector
662+
elements of a different type.
663+
664+
.. code-block:: c++
665+
666+
typedef int int4 __attribute__((ext_vector_type(4)));
667+
typedef bool bool4 __attribute__((ext_vector_type(4)));
668+
669+
int4 blend(bool4 cond, int4 a, int4 b) { return cond ? a : b; }
670+
660671

661672
Vector Literals
662673
---------------
@@ -757,11 +768,12 @@ elementwise to the input.
757768

758769
Unless specified otherwise operation(±0) = ±0 and operation(±infinity) = ±infinity
759770

760-
The integer elementwise intrinsics, including ``__builtin_elementwise_popcount``,
771+
The elementwise intrinsics ``__builtin_elementwise_popcount``,
761772
``__builtin_elementwise_bitreverse``, ``__builtin_elementwise_add_sat``,
762773
``__builtin_elementwise_sub_sat``, ``__builtin_elementwise_max``,
763-
``__builtin_elementwise_min``, and ``__builtin_elementwise_abs``
764-
can be called in a ``constexpr`` context.
774+
``__builtin_elementwise_min``, ``__builtin_elementwise_abs``,
775+
``__builtin_elementwise_ctlz``, ``__builtin_elementwise_cttz``, and
776+
``__builtin_elementwise_fma`` can be called in a ``constexpr`` context.
765777

766778
No implicit promotion of integer types takes place. The mixing of integer types
767779
of different sizes and signs is forbidden in binary and ternary builtins.
@@ -870,6 +882,14 @@ T __builtin_elementwise_fshr(T x, T y, T z) perform a funnel shift right. Co
870882
significant bits of the wide value), the combined value is shifted
871883
right by z, and the least significant bits are extracted to produce
872884
a result that is the same size as the original arguments.
885+
T __builtin_elementwise_ctlz(T x[, T y]) return the number of leading 0 bits in the first argument. If integer types
886+
the first argument is 0 and an optional second argument is provided,
887+
the second argument is returned. It is undefined behaviour if the
888+
first argument is 0 and no second argument is provided.
889+
T __builtin_elementwise_cttz(T x[, T y]) return the number of trailing 0 bits in the first argument. If integer types
890+
the first argument is 0 and an optional second argument is provided,
891+
the second argument is returned. It is undefined behaviour if the
892+
first argument is 0 and no second argument is provided.
873893
============================================== ====================================================================== =========================================
874894

875895

@@ -922,6 +942,24 @@ Let ``VT`` be a vector type and ``ET`` the element type of ``VT``.
922942
for the comparison.
923943
======================================= ====================================================================== ==================================
924944

945+
*Masked Builtins*
946+
947+
Each builtin accesses memory according to a provided boolean mask. These are
948+
provided as ``__builtin_masked_load`` and ``__builtin_masked_store``. The first
949+
argument is always boolean mask vector.
950+
951+
Example:
952+
953+
.. code-block:: c++
954+
955+
using v8b = bool [[clang::ext_vector_type(8)]];
956+
using v8i = int [[clang::ext_vector_type(8)]];
957+
958+
v8i load(v8b m, v8i *p) { return __builtin_masked_load(m, p); }
959+
960+
void store(v8b m, v8i v, v8i *p) { __builtin_masked_store(m, v, p); }
961+
962+
925963
Matrix Types
926964
============
927965

@@ -1791,6 +1829,37 @@ __make_integer_seq
17911829

17921830
This alias returns ``IntSeq`` instantiated with ``IntSeqT = T``and ``Ints`` being the pack ``0, ..., N - 1``.
17931831

1832+
__builtin_dedup_pack
1833+
--------------------
1834+
1835+
.. code-block:: c++
1836+
1837+
template <class... Ts>
1838+
using __builtin_dedup_pack = ...;
1839+
1840+
This alias takes a template parameter pack ``Ts`` and produces a new unexpanded pack containing the unique types
1841+
from ``Ts``, with the order of the first occurrence of each type preserved.
1842+
It is useful in template metaprogramming to normalize type lists.
1843+
1844+
The resulting pack can be expanded in contexts like template argument lists or base specifiers.
1845+
1846+
**Example of Use**:
1847+
1848+
.. code-block:: c++
1849+
1850+
template <typename...> struct TypeList;
1851+
1852+
// The resulting type is TypeList<int, double, char>
1853+
template <typename ...ExtraTypes>
1854+
using MyTypeList = TypeList<__builtin_dedup_pack<int, double, int, char, double, ExtraTypes...>...>;
1855+
1856+
**Limitations**:
1857+
1858+
* This builtin can only be used inside a template.
1859+
* The resulting pack is currently only supported for expansion in template argument lists and base specifiers.
1860+
* This builtin cannot be assigned to a template template parameter.
1861+
1862+
17941863
Type Trait Primitives
17951864
=====================
17961865

@@ -4370,7 +4439,7 @@ fall into one of the specified floating-point classes.
43704439
43714440
if (__builtin_isfpclass(x, 448)) {
43724441
// `x` is positive finite value
4373-
...
4442+
...
43744443
}
43754444
43764445
**Description**:

0 commit comments

Comments
 (0)