Skip to content

Commit 3d8a8f7

Browse files
authored
Merge branch 'main' into fix-98772
2 parents af4a682 + 5928619 commit 3d8a8f7

File tree

1,158 files changed

+62974
-43613
lines changed

Some content is hidden

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

1,158 files changed

+62974
-43613
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/Core/MCPlusBuilder.cpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ using namespace bolt;
3030
using namespace MCPlus;
3131

3232
namespace opts {
33+
cl::opt<bool>
34+
TerminalHLT("terminal-x86-hlt",
35+
cl::desc("Assume that execution stops at x86 HLT instruction"),
36+
cl::init(true), cl::Hidden, cl::cat(BoltCategory));
37+
3338
cl::opt<bool>
3439
TerminalTrap("terminal-trap",
3540
cl::desc("Assume that execution stops at trap instruction"),
@@ -132,10 +137,13 @@ bool MCPlusBuilder::equals(const MCSpecifierExpr &A, const MCSpecifierExpr &B,
132137
}
133138

134139
bool MCPlusBuilder::isTerminator(const MCInst &Inst) const {
135-
return (opts::TerminalTrap && Info->get(Inst.getOpcode()).isTrap()) ||
136-
Analysis->isTerminator(Inst)
137-
? !isX86HLT(Inst)
138-
: false;
140+
if (isX86HLT(Inst))
141+
return opts::TerminalHLT;
142+
143+
if (Info->get(Inst.getOpcode()).isTrap())
144+
return opts::TerminalTrap;
145+
146+
return Analysis->isTerminator(Inst);
139147
}
140148

141149
void MCPlusBuilder::setTailCall(MCInst &Inst) const {

bolt/lib/Rewrite/RewriteInstance.cpp

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ extern cl::opt<bool> KeepNops;
8484
extern cl::opt<bool> Lite;
8585
extern cl::list<std::string> ReorderData;
8686
extern cl::opt<bolt::ReorderFunctions::ReorderType> ReorderFunctions;
87+
extern cl::opt<bool> TerminalHLT;
8788
extern cl::opt<bool> TerminalTrap;
8889
extern cl::opt<bool> TimeBuild;
8990
extern cl::opt<bool> TimeRewrite;
@@ -880,14 +881,9 @@ void RewriteInstance::discoverFileObjects() {
880881
// code section (see IHI0056B). $d identifies data contents.
881882
// Compilers usually merge multiple data objects in a single $d-$x interval,
882883
// but we need every data object to be marked with $d. Because of that we
883-
// create a vector of MarkerSyms with all locations of data objects.
884+
// keep track of marker symbols with all locations of data objects.
884885

885-
struct MarkerSym {
886-
uint64_t Address;
887-
MarkerSymType Type;
888-
};
889-
890-
std::vector<MarkerSym> SortedMarkerSymbols;
886+
DenseMap<uint64_t, MarkerSymType> MarkerSymbols;
891887
auto addExtraDataMarkerPerSymbol = [&]() {
892888
bool IsData = false;
893889
uint64_t LastAddr = 0;
@@ -911,14 +907,14 @@ void RewriteInstance::discoverFileObjects() {
911907
}
912908

913909
if (MarkerType != MarkerSymType::NONE) {
914-
SortedMarkerSymbols.push_back(MarkerSym{SymInfo.Address, MarkerType});
910+
MarkerSymbols[SymInfo.Address] = MarkerType;
915911
LastAddr = SymInfo.Address;
916912
IsData = MarkerType == MarkerSymType::DATA;
917913
continue;
918914
}
919915

920916
if (IsData) {
921-
SortedMarkerSymbols.push_back({SymInfo.Address, MarkerSymType::DATA});
917+
MarkerSymbols[SymInfo.Address] = MarkerSymType::DATA;
922918
LastAddr = SymInfo.Address;
923919
}
924920
}
@@ -1283,27 +1279,24 @@ void RewriteInstance::discoverFileObjects() {
12831279
BC->setHasSymbolsWithFileName(FileSymbols.size());
12841280

12851281
// Now that all the functions were created - adjust their boundaries.
1286-
adjustFunctionBoundaries();
1282+
adjustFunctionBoundaries(MarkerSymbols);
12871283

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

12951288
if (!BF) {
12961289
// Stray marker
12971290
continue;
12981291
}
1299-
const auto EntryOffset = ISym->Address - BF->getAddress();
1300-
if (ISym->Type == MarkerSymType::CODE) {
1292+
const auto EntryOffset = Address - BF->getAddress();
1293+
if (Type == MarkerSymType::CODE) {
13011294
BF->markCodeAtOffset(EntryOffset);
13021295
continue;
13031296
}
1304-
if (ISym->Type == MarkerSymType::DATA) {
1297+
if (Type == MarkerSymType::DATA) {
13051298
BF->markDataAtOffset(EntryOffset);
1306-
BC->AddressToConstantIslandMap[ISym->Address] = BF;
1299+
BC->AddressToConstantIslandMap[Address] = BF;
13071300
continue;
13081301
}
13091302
llvm_unreachable("Unknown marker");
@@ -1832,7 +1825,8 @@ void RewriteInstance::disassemblePLT() {
18321825
}
18331826
}
18341827

1835-
void RewriteInstance::adjustFunctionBoundaries() {
1828+
void RewriteInstance::adjustFunctionBoundaries(
1829+
DenseMap<uint64_t, MarkerSymType> &MarkerSyms) {
18361830
for (auto BFI = BC->getBinaryFunctions().begin(),
18371831
BFE = BC->getBinaryFunctions().end();
18381832
BFI != BFE; ++BFI) {
@@ -1870,12 +1864,15 @@ void RewriteInstance::adjustFunctionBoundaries() {
18701864
continue;
18711865
}
18721866

1873-
// This is potentially another entry point into the function.
1874-
uint64_t EntryOffset = NextSymRefI->first - Function.getAddress();
1875-
LLVM_DEBUG(dbgs() << "BOLT-DEBUG: adding entry point to function "
1876-
<< Function << " at offset 0x"
1877-
<< Twine::utohexstr(EntryOffset) << '\n');
1878-
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+
}
18791876

18801877
++NextSymRefI;
18811878
}
@@ -2177,7 +2174,9 @@ void RewriteInstance::adjustCommandLineOptions() {
21772174
if (!opts::KeepNops.getNumOccurrences())
21782175
opts::KeepNops = true;
21792176

2180-
// Linux kernel may resume execution after a trap instruction in some cases.
2177+
// Linux kernel may resume execution after a trap or x86 HLT instruction.
2178+
if (!opts::TerminalHLT.getNumOccurrences())
2179+
opts::TerminalHLT = false;
21812180
if (!opts::TerminalTrap.getNumOccurrences())
21822181
opts::TerminalTrap = false;
21832182
}
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

bolt/test/X86/cfg_build_hlt.s

Lines changed: 0 additions & 17 deletions
This file was deleted.

bolt/test/X86/hlt-terminator.s

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
## Check that HLT instruction is handled differently depending on the flags.
2+
## It's a terminator in the user-level code, but the execution can resume in
3+
## ring 0.
4+
5+
# RUN: %clang %cflags %s -static -o %t.exe -nostdlib
6+
# RUN: llvm-bolt %t.exe --print-cfg --print-only=main --terminal-x86-hlt=0 \
7+
# RUN: -o %t.ring0 2>&1 | FileCheck %s --check-prefix=CHECK-RING0
8+
# RUN: llvm-bolt %t.exe --print-cfg --print-only=main \
9+
# RUN: -o %t.ring3 2>&1 | FileCheck %s --check-prefix=CHECK-RING3
10+
# RUN: llvm-objdump -d %t.ring0 --print-imm-hex | FileCheck %s --check-prefix=CHECK-BIN
11+
12+
# CHECK-RING0: BB Count : 1
13+
# CHECK-RING3: BB Count : 2
14+
15+
# CHECK-BIN: <main>:
16+
# CHECK-BIN-NEXT: f4 hlt
17+
# CHECK-BIN-NEXT: c3 retq
18+
19+
.global main
20+
.type main, %function
21+
main:
22+
hlt
23+
retq
24+
.size main, .-main

clang-tools-extra/clang-tidy/ClangTidy.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -544,7 +544,7 @@ runClangTidy(clang::tidy::ClangTidyContext &Context,
544544
ArrayRef<std::string> InputFiles,
545545
llvm::IntrusiveRefCntPtr<llvm::vfs::OverlayFileSystem> BaseFS,
546546
bool ApplyAnyFix, bool EnableCheckProfile,
547-
llvm::StringRef StoreCheckProfile) {
547+
llvm::StringRef StoreCheckProfile, bool Quiet) {
548548
ClangTool Tool(Compilations, InputFiles,
549549
std::make_shared<PCHContainerOperations>(), BaseFS);
550550

@@ -581,8 +581,9 @@ runClangTidy(clang::tidy::ClangTidyContext &Context,
581581
class ActionFactory : public FrontendActionFactory {
582582
public:
583583
ActionFactory(ClangTidyContext &Context,
584-
IntrusiveRefCntPtr<llvm::vfs::OverlayFileSystem> BaseFS)
585-
: ConsumerFactory(Context, std::move(BaseFS)) {}
584+
IntrusiveRefCntPtr<llvm::vfs::OverlayFileSystem> BaseFS,
585+
bool Quiet)
586+
: ConsumerFactory(Context, std::move(BaseFS)), Quiet(Quiet) {}
586587
std::unique_ptr<FrontendAction> create() override {
587588
return std::make_unique<Action>(&ConsumerFactory);
588589
}
@@ -593,6 +594,8 @@ runClangTidy(clang::tidy::ClangTidyContext &Context,
593594
DiagnosticConsumer *DiagConsumer) override {
594595
// Explicitly ask to define __clang_analyzer__ macro.
595596
Invocation->getPreprocessorOpts().SetUpStaticAnalyzer = true;
597+
if (Quiet)
598+
Invocation->getDiagnosticOpts().ShowCarets = false;
596599
return FrontendActionFactory::runInvocation(
597600
Invocation, Files, PCHContainerOps, DiagConsumer);
598601
}
@@ -611,9 +614,10 @@ runClangTidy(clang::tidy::ClangTidyContext &Context,
611614
};
612615

613616
ClangTidyASTConsumerFactory ConsumerFactory;
617+
bool Quiet;
614618
};
615619

616-
ActionFactory Factory(Context, std::move(BaseFS));
620+
ActionFactory Factory(Context, std::move(BaseFS), Quiet);
617621
Tool.run(&Factory);
618622
return DiagConsumer.take();
619623
}

clang-tools-extra/clang-tidy/ClangTidy.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,8 @@ runClangTidy(clang::tidy::ClangTidyContext &Context,
9494
ArrayRef<std::string> InputFiles,
9595
llvm::IntrusiveRefCntPtr<llvm::vfs::OverlayFileSystem> BaseFS,
9696
bool ApplyAnyFix, bool EnableCheckProfile = false,
97-
llvm::StringRef StoreCheckProfile = StringRef());
97+
llvm::StringRef StoreCheckProfile = StringRef(),
98+
bool Quiet = false);
9899

99100
/// Controls what kind of fixes clang-tidy is allowed to apply.
100101
enum FixBehaviour {

0 commit comments

Comments
 (0)