Skip to content

Commit 92e0a77

Browse files
committed
Merge remote-tracking branch 'origin/main' into lv-uniform-tailfold
2 parents f0b1ea4 + b4f3a96 commit 92e0a77

File tree

203 files changed

+4545
-4085
lines changed

Some content is hidden

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

203 files changed

+4545
-4085
lines changed

.github/workflows/issue-write.yml

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,21 @@ jobs:
2424
github.event.workflow_run.conclusion == 'failure'
2525
)
2626
steps:
27+
- name: Fetch Sources
28+
uses: actions/checkout@v4
29+
with:
30+
sparse-checkout: |
31+
.github/workflows/unprivileged-download-artifact/action.yml
32+
sparse-checkout-cone-mode: false
2733
- name: 'Download artifact'
28-
uses: actions/download-artifact@6b208ae046db98c579e8a3aa621ab581ff575935 # v4.1.1
34+
uses: ./.github/workflows/unprivileged-download-artifact
35+
id: download-artifact
2936
with:
30-
github-token: ${{ secrets.ISSUE_WRITE_DOWNLOAD_ARTIFACT }}
3137
run-id: ${{ github.event.workflow_run.id }}
32-
name: workflow-args
38+
artifact-name: workflow-args
3339

3440
- name: 'Comment on PR'
41+
if: steps.download-artifact.outputs.artifact-id != ''
3542
uses: actions/github-script@v3
3643
with:
3744
github-token: ${{ secrets.GITHUB_TOKEN }}
@@ -144,5 +151,7 @@ jobs:
144151
});
145152
146153
- name: Dump comments file
147-
if: always()
154+
if: >-
155+
always() &&
156+
steps.download-artifact.outputs.artifact-id != ''
148157
run: cat comments
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
name: Unprivileged Download Artifact
2+
description: >-
3+
Download artifacts from another workflow run without using an access token.
4+
inputs:
5+
run-id:
6+
description: >-
7+
The run-id for the workflow run that you want to download the artifact
8+
from. If ommitted it will download the most recently created artifact
9+
from the repo with the artifact-name.
10+
required: false
11+
artifact-name:
12+
desciption: The name of the artifact to download.
13+
required: true
14+
15+
16+
outputs:
17+
filename:
18+
description: >-
19+
The filename of the downloaded artifact or the empty string if the
20+
artifact was not found.
21+
value: ${{ steps.download-artifact.outputs.filename }}
22+
artifact-id:
23+
description: "The id of the artifact being downloaded."
24+
value: ${{ steps.artifact-url.outputs.id }}
25+
26+
27+
runs:
28+
using: "composite"
29+
steps:
30+
- uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea #v7.0.1
31+
id: artifact-url
32+
with:
33+
script: |
34+
var response;
35+
if (!"${{ inputs.run-id }}") {
36+
response = await github.rest.actions.listArtifactsForRepo({
37+
owner: context.repo.owner,
38+
repo: context.repo.repo,
39+
name: "${{ inputs.artifact-name }}"
40+
})
41+
} else {
42+
response = await github.rest.actions.listWorkflowRunArtifacts({
43+
owner: context.repo.owner,
44+
repo: context.repo.repo,
45+
run_id: "${{ inputs.run-id }}",
46+
name: "${{ inputs.artifact-name }}"
47+
})
48+
}
49+
50+
console.log(response)
51+
52+
for (artifact of response.data.artifacts) {
53+
console.log(artifact);
54+
}
55+
56+
if (response.data.artifacts.length == 0) {
57+
console.log("Could not find artifact ${{ inputs.artifact-name }} for workflow run ${{ inputs.run-id }}")
58+
return;
59+
}
60+
61+
const url_response = await github.rest.actions.downloadArtifact({
62+
owner: context.repo.owner,
63+
repo: context.repo.repo,
64+
artifact_id: response.data.artifacts[0].id,
65+
archive_format: "zip"
66+
})
67+
68+
core.setOutput("url", url_response.url);
69+
core.setOutput("id", response.data.artifacts[0].id);
70+
71+
- shell: bash
72+
if: steps.artifact-url.outputs.url != ''
73+
id: download-artifact
74+
run: |
75+
curl -L -o ${{ inputs.artifact-name }}.zip "${{ steps.artifact-url.outputs.url }}"
76+
echo "filename=${{ inputs.artifact-name }}.zip" >> $GITHUB_OUTPUT
77+
78+
- shell: bash
79+
if: steps.download-artifact.outputs.filename != ''
80+
run: |
81+
unzip ${{ steps.download-artifact.outputs.filename }}

a-abfdec1d.o.tmp

Whitespace-only changes.

bolt/docs/CommandLineArgumentReference.md

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -113,11 +113,6 @@
113113

114114
Prints out offsets for abbrev and debug_info of Skeleton CUs that get patched.
115115

116-
- `--deterministic-debuginfo`
117-
118-
Disables parallel execution of tasks that may produce nondeterministic debug
119-
info
120-
121116
- `--dot-tooltip-code`
122117

123118
Add basic block instructions as tool tips on nodes
@@ -686,6 +681,10 @@
686681
threshold means fewer functions to process. E.g threshold of 90 means only top
687682
10 percent of functions with profile will be processed.
688683

684+
- `--match-with-call-graph`
685+
686+
Match functions with call graph
687+
689688
- `--memcpy1-spec=<func1,func2:cs1:cs2,func3:cs1,...>`
690689

691690
List of functions with call sites for which to specialize memcpy() for size 1

bolt/docs/OptimizingClang.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ $ cd ${TOPLEV}/stage3
4949
$ CPATH=${TOPLEV}/stage2-prof-use-lto/install/bin/
5050
$ cmake -G Ninja ${TOPLEV}/llvm -DLLVM_TARGETS_TO_BUILD=X86 -DCMAKE_BUILD_TYPE=Release \
5151
-DCMAKE_C_COMPILER=$CPATH/clang -DCMAKE_CXX_COMPILER=$CPATH/clang++ \
52+
-DLLVM_ENABLE_PROJECTS="clang" \
5253
-DLLVM_USE_LINKER=lld -DCMAKE_INSTALL_PREFIX=${TOPLEV}/stage3/install
5354
$ perf record -e cycles:u -j any,u -- ninja clang
5455
```

bolt/docs/generate_doc.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ def parse_bolt_options(output):
4545
cleaned_line = line.strip()
4646

4747
if cleaned_line.casefold() in map(str.casefold, section_headers):
48-
if prev_section != None: # Save last option from prev section
48+
if prev_section is not None: # Save last option from prev section
4949
add_info(sections, current_section, option, description)
5050
option, description = None, []
5151

@@ -76,7 +76,7 @@ def parse_bolt_options(output):
7676
description = [descr]
7777
if option.startswith("--print") or option.startswith("--time"):
7878
current_section = "BOLT printing options:"
79-
elif prev_section != None:
79+
elif prev_section is not None:
8080
current_section = prev_section
8181
continue
8282

bolt/include/bolt/Profile/YAMLProfileReader.h

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,59 @@ class YAMLProfileReader : public ProfileReaderBase {
4343
using ProfileLookupMap =
4444
DenseMap<uint32_t, yaml::bolt::BinaryFunctionProfile *>;
4545

46+
/// A class for matching binary functions in functions in the YAML profile.
47+
/// First, a call graph is constructed for both profiled and binary functions.
48+
/// Then functions are hashed based on the names of their callee/caller
49+
/// functions. Finally, functions are matched based on these neighbor hashes.
50+
class CallGraphMatcher {
51+
public:
52+
/// Constructs the call graphs for binary and profiled functions and
53+
/// computes neighbor hashes for binary functions.
54+
CallGraphMatcher(BinaryContext &BC, yaml::bolt::BinaryProfile &YamlBP,
55+
ProfileLookupMap &IdToYAMLBF);
56+
57+
/// Returns the YamlBFs adjacent to the parameter YamlBF in the call graph.
58+
std::optional<std::set<yaml::bolt::BinaryFunctionProfile *>>
59+
getAdjacentYamlBFs(yaml::bolt::BinaryFunctionProfile &YamlBF) {
60+
auto It = YamlBFAdjacencyMap.find(&YamlBF);
61+
return It == YamlBFAdjacencyMap.end() ? std::nullopt
62+
: std::make_optional(It->second);
63+
}
64+
65+
/// Returns the binary functions with the parameter neighbor hash.
66+
std::optional<std::vector<BinaryFunction *>>
67+
getBFsWithNeighborHash(uint64_t NeighborHash) {
68+
auto It = NeighborHashToBFs.find(NeighborHash);
69+
return It == NeighborHashToBFs.end() ? std::nullopt
70+
: std::make_optional(It->second);
71+
}
72+
73+
private:
74+
/// Adds edges to the binary function call graph given the callsites of the
75+
/// parameter function.
76+
void constructBFCG(BinaryContext &BC, yaml::bolt::BinaryProfile &YamlBP);
77+
78+
/// Using the constructed binary function call graph, computes and creates
79+
/// mappings from "neighbor hash" (composed of the function names of callee
80+
/// and caller functions of a function) to binary functions.
81+
void computeBFNeighborHashes(BinaryContext &BC);
82+
83+
/// Constructs the call graph for profile functions.
84+
void constructYAMLFCG(yaml::bolt::BinaryProfile &YamlBP,
85+
ProfileLookupMap &IdToYAMLBF);
86+
87+
/// Adjacency map for binary functions in the call graph.
88+
DenseMap<BinaryFunction *, std::set<BinaryFunction *>> BFAdjacencyMap;
89+
90+
/// Maps neighbor hashes to binary functions.
91+
DenseMap<uint64_t, std::vector<BinaryFunction *>> NeighborHashToBFs;
92+
93+
/// Adjacency map for profile functions in the call graph.
94+
DenseMap<yaml::bolt::BinaryFunctionProfile *,
95+
std::set<yaml::bolt::BinaryFunctionProfile *>>
96+
YamlBFAdjacencyMap;
97+
};
98+
4699
private:
47100
/// Adjustments for basic samples profiles (without LBR).
48101
bool NormalizeByInsnCount{false};
@@ -100,6 +153,9 @@ class YAMLProfileReader : public ProfileReaderBase {
100153
/// Matches functions using exact hash.
101154
size_t matchWithHash(BinaryContext &BC);
102155

156+
/// Matches functions using the call graph.
157+
size_t matchWithCallGraph(BinaryContext &BC);
158+
103159
/// Matches functions with similarly named profiled functions.
104160
size_t matchWithNameSimilarity(BinaryContext &BC);
105161

0 commit comments

Comments
 (0)