Skip to content

Commit 63f7cb1

Browse files
authored
merge amd-staging into amd-feature/wave-transform (#472)
2 parents 30560ae + 854e4e7 commit 63f7cb1

File tree

3,029 files changed

+337557
-37221
lines changed

Some content is hidden

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

3,029 files changed

+337557
-37221
lines changed
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
---
2+
applyTo: lldb/**/*
3+
---
4+
5+
When reviewing code, focus on:
6+
7+
## Language, Libraries & Standards
8+
9+
- Target C++17 and avoid vendor-specific extensions.
10+
- For Python scripts, follow PEP 8.
11+
- Prefer standard library or LLVM support libraries instead of reinventing data structures.
12+
13+
## Comments & Documentation
14+
15+
- Each source file should include the standard LLVM file header.
16+
- Header files must have proper header guards.
17+
- Non-trivial classes and public methods should have Doxygen documentation.
18+
- Use `//` or `///` comments normally; avoid block comments unless necessary.
19+
- Non-trivial code should have comments explaining what it does and why. Avoid comments that explain how it does it at a micro level.
20+
21+
## Language & Compiler Issues
22+
23+
- Write portable code; wrap non-portable code in interfaces.
24+
- Do not use RTTI or exceptions.
25+
- Prefer C++-style casts over C-style casts.
26+
- Do not use static constructors.
27+
- Use `class` or `struct` consistently; `struct` only for all-public data.
28+
- When then same class is declared or defined multiple times, make sure it's consistently done using either `class` or `struct`.
29+
30+
## Headers & Library Layering
31+
32+
- Include order: module header → local/private headers → project headers → system headers.
33+
- Headers must compile standalone (include all dependencies).
34+
- Maintain proper library layering; avoid circular dependencies.
35+
- Include minimally; use forward declarations where possible.
36+
- Keep internal headers private to modules.
37+
- Use full namespace qualifiers for out-of-line definitions.
38+
39+
## Control Flow & Structure
40+
41+
- Prefer early exits over deep nesting.
42+
- Do not use `else` after `return`, `continue`, `break`, or `goto`.
43+
- Encapsulate loops that compute predicates into helper functions.
44+
45+
## Naming
46+
47+
- LLDB's code style differs from LLVM's coding style.
48+
- Variables are `snake_case`.
49+
- Functions and methods are `UpperCamelCase`.
50+
- Static, global and member variables have `s_`, `g_` and `m_` prefixes respectively.
51+
52+
## General Guidelines
53+
54+
- Use `assert` liberally; prefer `llvm_unreachable` for unreachable states.
55+
- Do not use `using namespace std;` in headers.
56+
- Provide a virtual method anchor for classes defined in headers.
57+
- Do not use default labels in fully covered switches over enumerations.
58+
- Use range-based for loops wherever possible.
59+
- Capture `end()` outside loops if not using range-based iteration.
60+
- Including `<iostream>` is forbidded. Use LLVM’s `raw_ostream` instead.
61+
- Don’t use `inline` when defining a function in a class definition.
62+
63+
## Microscopic Details
64+
65+
- Preserve existing style in modified code.
66+
- Prefer pre-increment (`++i`) when value is unused.
67+
- Use `private`, `protected`, or `public` keyword as appropriate to restrict class member visibility.
68+
- Omit braces for single-statement `if`, `else`, `while`, `for` unless needed.
69+
70+
## Review Style
71+
72+
- Be specific and actionable in feedback.
73+
- Explain the "why" behind recommendations.
74+
- Link back to the LLVM Coding Standards: https://llvm.org/docs/CodingStandards.html.
75+
- Ask clarifying questions when code intent is unclear.
76+
77+
Ignore formatting and assume that's handled by external tools like `clang-format` and `black`.
78+
Remember that these standards are **guidelines**.
79+
Always prioritize consistency with the style that is already being used by the surrounding code.

.github/copilot-instructions.md renamed to .github/instructions/llvm.instructions.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
---
2+
applyTo: llvm/**/*
3+
---
4+
15
When performing a code review, pay close attention to code modifying a function's
26
control flow. Could the change result in the corruption of performance profile
37
data? Could the change result in invalid debug information, in particular for

.github/workflows/release-binaries-all.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,6 @@ jobs:
9090
runs-on:
9191
- ubuntu-22.04
9292
- ubuntu-22.04-arm
93-
- macos-13
9493
- macos-14
9594

9695
uses: ./.github/workflows/release-binaries.yml

.github/workflows/release-binaries.yml

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ on:
2121
options:
2222
- ubuntu-22.04
2323
- ubuntu-22.04-arm
24-
- macos-13
2524
- macos-14
2625

2726
workflow_call:
@@ -130,13 +129,6 @@ jobs:
130129
target_cmake_flags="$target_cmake_flags -DBOOTSTRAP_BOOTSTRAP_COMPILER_RT_ENABLE_IOS=OFF"
131130
if [ "$RUNNER_ARCH" = "ARM64" ]; then
132131
arches=arm64
133-
else
134-
arches=x86_64
135-
# Disable Flang builds on macOS x86_64. The FortranLower library takes
136-
# 2-3 hours to build on macOS, much slower than on Linux.
137-
# The long build time causes the release build to time out on x86_64,
138-
# so we need to disable flang there.
139-
target_cmake_flags="$target_cmake_flags -DLLVM_RELEASE_ENABLE_PROJECTS='clang;lld;lldb;clang-tools-extra;polly;mlir'"
140132
fi
141133
target_cmake_flags="$target_cmake_flags -DBOOTSTRAP_BOOTSTRAP_DARWIN_osx_ARCHS=$arches -DBOOTSTRAP_BOOTSTRAP_DARWIN_osx_BUILTIN_ARCHS=$arches"
142134
fi
@@ -152,14 +144,6 @@ jobs:
152144
build_runs_on="depot-${{ inputs.runs-on }}-16"
153145
test_runs_on=$build_runs_on
154146
;;
155-
macos-13)
156-
if [ "$GITHUB_EVENT_NAME" = "pull_request" ]; then
157-
build_runs_on="${{ inputs.runs-on }}"
158-
else
159-
build_runs_on="macos-13-large"
160-
fi
161-
test_runs_on="${{ inputs.runs-on }}"
162-
;;
163147
macos-14)
164148
if [ "$GITHUB_EVENT_NAME" = "pull_request" ]; then
165149
build_runs_on="${{ inputs.runs-on }}"

bolt/include/bolt/Core/BinaryContext.h

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -781,11 +781,6 @@ class BinaryContext {
781781
uint64_t PseudoProbeLooseMatchedSampleCount{0};
782782
/// the count of call matched samples
783783
uint64_t CallMatchedSampleCount{0};
784-
/// the number of stale functions that have matching number of blocks in
785-
/// the profile
786-
uint64_t NumStaleFuncsWithEqualBlockCount{0};
787-
/// the number of blocks that have matching size but a differing hash
788-
uint64_t NumStaleBlocksWithEqualIcount{0};
789784
} Stats;
790785

791786
// Original binary execution count stats.
@@ -937,6 +932,16 @@ class BinaryContext {
937932
std::pair<const MCSymbol *, uint64_t>
938933
handleAddressRef(uint64_t Address, BinaryFunction &BF, bool IsPCRel);
939934

935+
/// When \p Address inside function \p BF is a target of a control transfer
936+
/// instruction (branch) from another function, return a corresponding symbol
937+
/// that should be used by the branch. For example, main or secondary entry
938+
/// point.
939+
///
940+
/// If \p Address is an invalid destination, such as a constant island, return
941+
/// nullptr and mark \p BF as ignored, since we cannot properly handle a
942+
/// branch to a constant island.
943+
MCSymbol *handleExternalBranchTarget(uint64_t Address, BinaryFunction &BF);
944+
940945
/// Analyze memory contents at the given \p Address and return the type of
941946
/// memory contents (such as a possible jump table).
942947
MemoryContentsType analyzeMemoryAt(uint64_t Address, BinaryFunction &BF);

bolt/include/bolt/Passes/MarkRAStates.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,16 @@
1313
#define BOLT_PASSES_MARK_RA_STATES
1414

1515
#include "bolt/Passes/BinaryPasses.h"
16+
#include <mutex>
1617

1718
namespace llvm {
1819
namespace bolt {
1920

2021
class MarkRAStates : public BinaryFunctionPass {
22+
// setIgnored() is not thread-safe, but the pass is running on functions in
23+
// parallel.
24+
std::mutex IgnoreMutex;
25+
2126
public:
2227
explicit MarkRAStates() : BinaryFunctionPass(false) {}
2328

bolt/lib/Core/BinaryContext.cpp

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,23 @@ BinaryContext::handleAddressRef(uint64_t Address, BinaryFunction &BF,
518518
return std::make_pair(TargetSymbol, 0);
519519
}
520520

521+
MCSymbol *BinaryContext::handleExternalBranchTarget(uint64_t Address,
522+
BinaryFunction &BF) {
523+
if (BF.isInConstantIsland(Address)) {
524+
BF.setIgnored();
525+
this->outs() << "BOLT-WARNING: ignoring entry point at address 0x"
526+
<< Twine::utohexstr(Address)
527+
<< " in constant island of function " << BF << '\n';
528+
return nullptr;
529+
}
530+
531+
const uint64_t Offset = Address - BF.getAddress();
532+
assert(Offset < BF.getSize() &&
533+
"Address should be inside the referenced function");
534+
535+
return Offset ? BF.addEntryPointAtOffset(Offset) : BF.getSymbol();
536+
}
537+
521538
MemoryContentsType BinaryContext::analyzeMemoryAt(uint64_t Address,
522539
BinaryFunction &BF) {
523540
if (!isX86())
@@ -1399,17 +1416,10 @@ void BinaryContext::processInterproceduralReferences() {
13991416
<< Function.getPrintName() << " and "
14001417
<< TargetFunction->getPrintName() << '\n';
14011418
}
1402-
if (uint64_t Offset = Address - TargetFunction->getAddress()) {
1403-
if (!TargetFunction->isInConstantIsland(Address)) {
1404-
TargetFunction->addEntryPointAtOffset(Offset);
1405-
} else {
1406-
TargetFunction->setIgnored();
1407-
this->outs() << "BOLT-WARNING: Ignoring entry point at address 0x"
1408-
<< Twine::utohexstr(Address)
1409-
<< " in constant island of function " << *TargetFunction
1410-
<< '\n';
1411-
}
1412-
}
1419+
1420+
// Create an extra entry point if needed. Can also render the target
1421+
// function ignored if the reference is invalid.
1422+
handleExternalBranchTarget(Address, *TargetFunction);
14131423

14141424
continue;
14151425
}

bolt/lib/Core/BinaryFunction.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1697,11 +1697,12 @@ bool BinaryFunction::scanExternalRefs() {
16971697
if (!TargetFunction || ignoreFunctionRef(*TargetFunction))
16981698
continue;
16991699

1700-
const uint64_t FunctionOffset =
1701-
TargetAddress - TargetFunction->getAddress();
1700+
// Get a reference symbol for the function when address is a valid code
1701+
// reference.
17021702
BranchTargetSymbol =
1703-
FunctionOffset ? TargetFunction->addEntryPointAtOffset(FunctionOffset)
1704-
: TargetFunction->getSymbol();
1703+
BC.handleExternalBranchTarget(TargetAddress, *TargetFunction);
1704+
if (!BranchTargetSymbol)
1705+
continue;
17051706
}
17061707

17071708
// Can't find more references. Not creating relocations since we are not

bolt/lib/Passes/BinaryPasses.cpp

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1508,12 +1508,6 @@ Error PrintProgramStats::runOnFunctions(BinaryContext &BC) {
15081508
if (NumAllStaleFunctions) {
15091509
const float PctStale =
15101510
NumAllStaleFunctions / (float)NumAllProfiledFunctions * 100.0f;
1511-
const float PctStaleFuncsWithEqualBlockCount =
1512-
(float)BC.Stats.NumStaleFuncsWithEqualBlockCount /
1513-
NumAllStaleFunctions * 100.0f;
1514-
const float PctStaleBlocksWithEqualIcount =
1515-
(float)BC.Stats.NumStaleBlocksWithEqualIcount /
1516-
BC.Stats.NumStaleBlocks * 100.0f;
15171511
auto printErrorOrWarning = [&]() {
15181512
if (PctStale > opts::StaleThreshold)
15191513
BC.errs() << "BOLT-ERROR: ";
@@ -1536,17 +1530,6 @@ Error PrintProgramStats::runOnFunctions(BinaryContext &BC) {
15361530
<< "%) belong to functions with invalid"
15371531
" (possibly stale) profile.\n";
15381532
}
1539-
BC.outs() << "BOLT-INFO: " << BC.Stats.NumStaleFuncsWithEqualBlockCount
1540-
<< " stale function"
1541-
<< (BC.Stats.NumStaleFuncsWithEqualBlockCount == 1 ? "" : "s")
1542-
<< format(" (%.1f%% of all stale)",
1543-
PctStaleFuncsWithEqualBlockCount)
1544-
<< " have matching block count.\n";
1545-
BC.outs() << "BOLT-INFO: " << BC.Stats.NumStaleBlocksWithEqualIcount
1546-
<< " stale block"
1547-
<< (BC.Stats.NumStaleBlocksWithEqualIcount == 1 ? "" : "s")
1548-
<< format(" (%.1f%% of all stale)", PctStaleBlocksWithEqualIcount)
1549-
<< " have matching icount.\n";
15501533
if (PctStale > opts::StaleThreshold) {
15511534
return createFatalBOLTError(
15521535
Twine("BOLT-ERROR: stale functions exceed specified threshold of ") +

bolt/lib/Passes/MarkRAStates.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,11 @@ bool MarkRAStates::runOnFunction(BinaryFunction &BF) {
4343
// Not all functions have .cfi_negate_ra_state in them. But if one does,
4444
// we expect psign/pauth instructions to have the hasNegateRAState
4545
// annotation.
46-
BF.setIgnored();
4746
BC.outs() << "BOLT-INFO: inconsistent RAStates in function "
4847
<< BF.getPrintName()
4948
<< ": ptr sign/auth inst without .cfi_negate_ra_state\n";
49+
std::lock_guard<std::mutex> Lock(IgnoreMutex);
50+
BF.setIgnored();
5051
return false;
5152
}
5253
}
@@ -67,6 +68,7 @@ bool MarkRAStates::runOnFunction(BinaryFunction &BF) {
6768
BC.outs() << "BOLT-INFO: inconsistent RAStates in function "
6869
<< BF.getPrintName()
6970
<< ": ptr signing inst encountered in Signed RA state\n";
71+
std::lock_guard<std::mutex> Lock(IgnoreMutex);
7072
BF.setIgnored();
7173
return false;
7274
}
@@ -80,6 +82,7 @@ bool MarkRAStates::runOnFunction(BinaryFunction &BF) {
8082
<< BF.getPrintName()
8183
<< ": ptr authenticating inst encountered in Unsigned RA "
8284
"state\n";
85+
std::lock_guard<std::mutex> Lock(IgnoreMutex);
8386
BF.setIgnored();
8487
return false;
8588
}

0 commit comments

Comments
 (0)