Skip to content

Commit 9dbafb7

Browse files
committed
merge main into amd-staging
2 parents 585148f + a43ff0e commit 9dbafb7

File tree

154 files changed

+4580
-1130
lines changed

Some content is hidden

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

154 files changed

+4580
-1130
lines changed

.github/workflows/libcxx-build-and-test.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,8 @@ jobs:
216216
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
217217
- uses: maxim-lobanov/setup-xcode@60606e260d2fc5762a71e64e74b2174e8ea3c8bd # v1.6.0
218218
with:
219-
xcode-version: 'latest'
219+
# https://github.com/actions/runner-images/blob/main/images/macos/macos-15-Readme.md
220+
xcode-version: '16.3'
220221
- uses: seanmiddleditch/gha-setup-ninja@3b1f8f94a2f8254bd26914c4ab9474d4f0015f67 # v6
221222
- name: Build and test
222223
run: |

bolt/lib/Core/Relocation.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ static bool isSupportedAArch64(uint32_t Type) {
9696
case ELF::R_AARCH64_MOVW_UABS_G2:
9797
case ELF::R_AARCH64_MOVW_UABS_G2_NC:
9898
case ELF::R_AARCH64_MOVW_UABS_G3:
99+
case ELF::R_AARCH64_PLT32:
99100
return true;
100101
}
101102
}
@@ -202,6 +203,7 @@ static size_t getSizeForTypeAArch64(uint32_t Type) {
202203
case ELF::R_AARCH64_MOVW_UABS_G2_NC:
203204
case ELF::R_AARCH64_MOVW_UABS_G3:
204205
case ELF::R_AARCH64_ABS32:
206+
case ELF::R_AARCH64_PLT32:
205207
return 4;
206208
case ELF::R_AARCH64_ABS64:
207209
case ELF::R_AARCH64_PREL64:
@@ -354,6 +356,7 @@ static uint64_t extractValueAArch64(uint32_t Type, uint64_t Contents,
354356
case ELF::R_AARCH64_PREL16:
355357
return static_cast<int64_t>(PC) + SignExtend64<16>(Contents & 0xffff);
356358
case ELF::R_AARCH64_PREL32:
359+
case ELF::R_AARCH64_PLT32:
357360
return static_cast<int64_t>(PC) + SignExtend64<32>(Contents & 0xffffffff);
358361
case ELF::R_AARCH64_PREL64:
359362
return static_cast<int64_t>(PC) + Contents;
@@ -676,6 +679,7 @@ static bool isPCRelativeAArch64(uint32_t Type) {
676679
case ELF::R_AARCH64_PREL16:
677680
case ELF::R_AARCH64_PREL32:
678681
case ELF::R_AARCH64_PREL64:
682+
case ELF::R_AARCH64_PLT32:
679683
return true;
680684
}
681685
}

bolt/lib/Rewrite/RewriteInstance.cpp

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2603,7 +2603,9 @@ void RewriteInstance::readRelocations(const SectionRef &Section) {
26032603
void RewriteInstance::handleRelocation(const SectionRef &RelocatedSection,
26042604
const RelocationRef &Rel) {
26052605
const bool IsAArch64 = BC->isAArch64();
2606+
const bool IsX86 = BC->isX86();
26062607
const bool IsFromCode = RelocatedSection.isText();
2608+
const bool IsWritable = BinarySection(*BC, RelocatedSection).isWritable();
26072609

26082610
SmallString<16> TypeName;
26092611
Rel.getTypeName(TypeName);
@@ -2612,15 +2614,15 @@ void RewriteInstance::handleRelocation(const SectionRef &RelocatedSection,
26122614
return;
26132615

26142616
// Adjust the relocation type as the linker might have skewed it.
2615-
if (BC->isX86() && (RType & ELF::R_X86_64_converted_reloc_bit)) {
2617+
if (IsX86 && (RType & ELF::R_X86_64_converted_reloc_bit)) {
26162618
if (opts::Verbosity >= 1)
26172619
dbgs() << "BOLT-WARNING: ignoring R_X86_64_converted_reloc_bit\n";
26182620
RType &= ~ELF::R_X86_64_converted_reloc_bit;
26192621
}
26202622

26212623
if (Relocation::isTLS(RType)) {
26222624
// No special handling required for TLS relocations on X86.
2623-
if (BC->isX86())
2625+
if (IsX86)
26242626
return;
26252627

26262628
// The non-got related TLS relocations on AArch64 and RISC-V also could be
@@ -2661,6 +2663,30 @@ void RewriteInstance::handleRelocation(const SectionRef &RelocatedSection,
26612663
return;
26622664
}
26632665

2666+
if (!IsFromCode && !IsWritable && (IsX86 || IsAArch64) &&
2667+
Relocation::isPCRelative(RType)) {
2668+
BinaryData *BD = BC->getBinaryDataContainingAddress(Rel.getOffset());
2669+
if (BD && (BD->nameStartsWith("_ZTV") || // vtable
2670+
BD->nameStartsWith("_ZTCN"))) { // construction vtable
2671+
BinaryFunction *BF = BC->getBinaryFunctionContainingAddress(
2672+
SymbolAddress, /*CheckPastEnd*/ false, /*UseMaxSize*/ true);
2673+
if (!BF || BF->getAddress() != SymbolAddress) {
2674+
BC->errs()
2675+
<< "BOLT-ERROR: the virtual function table entry at offset 0x"
2676+
<< Twine::utohexstr(Rel.getOffset());
2677+
if (BF)
2678+
BC->errs() << " points to the middle of a function @ 0x"
2679+
<< Twine::utohexstr(BF->getAddress()) << "\n";
2680+
else
2681+
BC->errs() << " does not point to any function\n";
2682+
exit(1);
2683+
}
2684+
BC->addRelocation(Rel.getOffset(), BF->getSymbol(), RType, Addend,
2685+
ExtractedValue);
2686+
return;
2687+
}
2688+
}
2689+
26642690
const uint64_t Address = SymbolAddress + Addend;
26652691

26662692
LLVM_DEBUG({
@@ -2724,7 +2750,7 @@ void RewriteInstance::handleRelocation(const SectionRef &RelocatedSection,
27242750
const bool IsToCode = ReferencedSection && ReferencedSection->isText();
27252751

27262752
// Special handling of PC-relative relocations.
2727-
if (BC->isX86() && Relocation::isPCRelative(RType)) {
2753+
if (IsX86 && Relocation::isPCRelative(RType)) {
27282754
if (!IsFromCode && IsToCode) {
27292755
// PC-relative relocations from data to code are tricky since the
27302756
// original information is typically lost after linking, even with
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
// Test BOLT is able to handle relative virtual function table, i.e., when
2+
// code is compiled with `-fexperimental-relative-c++-abi-vtables`.
3+
4+
// REQUIRES: system-linux
5+
6+
// RUN: split-file %s %t
7+
// RUN: %clang -fuse-ld=lld -o %t/main.so %t/tt.cpp %t/main.cpp -Wl,-q \
8+
// RUN: -fno-rtti -fexperimental-relative-c++-abi-vtables
9+
// RUN: %t/main.so | FileCheck %s
10+
11+
// CHECK: derived_foo
12+
// CHECK-NEXT: derived_bar
13+
// CHECK-NEXT: derived_goo
14+
15+
// RUN: llvm-bolt %t/main.so -o %t/main.bolted.so --trap-old-code
16+
// RUN: %t/main.bolted.so | FileCheck %s
17+
18+
;--- tt.h
19+
#include <stdio.h>
20+
21+
class Base {
22+
public:
23+
virtual void foo();
24+
virtual void bar();
25+
virtual void goo();
26+
};
27+
28+
class Derived : public Base {
29+
public:
30+
virtual void foo() override;
31+
virtual void bar() override;
32+
virtual void goo() override;
33+
};
34+
35+
;--- tt.cpp
36+
#include "tt.h"
37+
void Derived::goo() { printf("derived_goo\n"); }
38+
39+
;--- main.cpp
40+
#include "tt.h"
41+
#pragma clang optimize off
42+
43+
void Base::foo() { printf("base_foo\n"); }
44+
void Base::bar() { printf("base_bar\n"); }
45+
void Base::goo() { printf("base_goo\n"); }
46+
47+
void Derived::foo() { printf("derived_foo\n"); }
48+
void Derived::bar() { printf("derived_bar\n"); }
49+
50+
int main() {
51+
Derived D;
52+
Base *ptr = &D;
53+
ptr->foo();
54+
ptr->bar();
55+
ptr->goo();
56+
return 0;
57+
}

clang-tools-extra/clang-tidy/readability/StaticAccessedThroughInstanceCheck.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ void StaticAccessedThroughInstanceCheck::check(
6969
PrintingPolicyWithSuppressedTag.SuppressTagKeyword = true;
7070
PrintingPolicyWithSuppressedTag.SuppressUnwrittenScope = true;
7171

72-
PrintingPolicyWithSuppressedTag.PrintCanonicalTypes =
72+
PrintingPolicyWithSuppressedTag.PrintAsCanonical =
7373
!BaseExpr->getType()->isTypedefNameType();
7474

7575
std::string BaseTypeName =

clang-tools-extra/clang-tidy/utils/Matchers.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ bool MatchesAnyListedTypeNameMatcher::matches(
3333

3434
PrintingPolicy PrintingPolicyWithSuppressedTag(
3535
Finder->getASTContext().getLangOpts());
36-
PrintingPolicyWithSuppressedTag.PrintCanonicalTypes = CanonicalTypes;
36+
PrintingPolicyWithSuppressedTag.PrintAsCanonical = CanonicalTypes;
3737
PrintingPolicyWithSuppressedTag.SuppressElaboration = true;
3838
PrintingPolicyWithSuppressedTag.SuppressScope = false;
3939
PrintingPolicyWithSuppressedTag.SuppressTagKeyword = true;

clang/include/clang/AST/PrettyPrinter.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ struct PrintingPolicy {
7676
MSWChar(LO.MicrosoftExt && !LO.WChar), IncludeNewlines(true),
7777
MSVCFormatting(false), ConstantsAsWritten(false),
7878
SuppressImplicitBase(false), FullyQualifiedName(false),
79-
PrintCanonicalTypes(false), PrintInjectedClassNameWithArguments(true),
79+
PrintAsCanonical(false), PrintInjectedClassNameWithArguments(true),
8080
UsePreferredNames(true), AlwaysIncludeTypeForTemplateArgument(false),
8181
CleanUglifiedParameters(false), EntireContentsOfLargeArray(true),
8282
UseEnumerators(true), UseHLSLTypes(LO.HLSL) {}
@@ -310,9 +310,9 @@ struct PrintingPolicy {
310310
LLVM_PREFERRED_TYPE(bool)
311311
unsigned FullyQualifiedName : 1;
312312

313-
/// Whether to print types as written or canonically.
313+
/// Whether to print entities as written or canonically.
314314
LLVM_PREFERRED_TYPE(bool)
315-
unsigned PrintCanonicalTypes : 1;
315+
unsigned PrintAsCanonical : 1;
316316

317317
/// Whether to print an InjectedClassNameType with template arguments or as
318318
/// written. When a template argument is unnamed, printing it results in

clang/lib/AST/DeclPrinter.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -735,7 +735,7 @@ void DeclPrinter::VisitFunctionDecl(FunctionDecl *D) {
735735
llvm::raw_string_ostream POut(Proto);
736736
DeclPrinter TArgPrinter(POut, SubPolicy, Context, Indentation);
737737
const auto *TArgAsWritten = D->getTemplateSpecializationArgsAsWritten();
738-
if (TArgAsWritten && !Policy.PrintCanonicalTypes)
738+
if (TArgAsWritten && !Policy.PrintAsCanonical)
739739
TArgPrinter.printTemplateArguments(TArgAsWritten->arguments(), nullptr);
740740
else if (const TemplateArgumentList *TArgs =
741741
D->getTemplateSpecializationArgs())
@@ -1124,7 +1124,7 @@ void DeclPrinter::VisitCXXRecordDecl(CXXRecordDecl *D) {
11241124
S->getSpecializedTemplate()->getTemplateParameters();
11251125
const ASTTemplateArgumentListInfo *TArgAsWritten =
11261126
S->getTemplateArgsAsWritten();
1127-
if (TArgAsWritten && !Policy.PrintCanonicalTypes)
1127+
if (TArgAsWritten && !Policy.PrintAsCanonical)
11281128
printTemplateArguments(TArgAsWritten->arguments(), TParams);
11291129
else
11301130
printTemplateArguments(S->getTemplateArgs().asArray(), TParams);

clang/lib/AST/JSONNodeDumper.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1724,6 +1724,8 @@ void JSONNodeDumper::VisitTemplateExpansionTemplateArgument(
17241724
void JSONNodeDumper::VisitExpressionTemplateArgument(
17251725
const TemplateArgument &TA) {
17261726
JOS.attribute("isExpr", true);
1727+
if (TA.isCanonicalExpr())
1728+
JOS.attribute("isCanonical", true);
17271729
}
17281730
void JSONNodeDumper::VisitPackTemplateArgument(const TemplateArgument &TA) {
17291731
JOS.attribute("isPack", true);

clang/lib/AST/StmtPrinter.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1305,9 +1305,13 @@ void StmtPrinter::VisitDeclRefExpr(DeclRefExpr *Node) {
13051305
Qualifier->print(OS, Policy);
13061306
if (Node->hasTemplateKeyword())
13071307
OS << "template ";
1308+
1309+
bool ForceAnonymous =
1310+
Policy.PrintAsCanonical && VD->getKind() == Decl::NonTypeTemplateParm;
13081311
DeclarationNameInfo NameInfo = Node->getNameInfo();
13091312
if (IdentifierInfo *ID = NameInfo.getName().getAsIdentifierInfo();
1310-
ID || NameInfo.getName().getNameKind() != DeclarationName::Identifier) {
1313+
!ForceAnonymous &&
1314+
(ID || NameInfo.getName().getNameKind() != DeclarationName::Identifier)) {
13111315
if (Policy.CleanUglifiedParameters &&
13121316
isa<ParmVarDecl, NonTypeTemplateParmDecl>(VD) && ID)
13131317
OS << ID->deuglifiedName();

0 commit comments

Comments
 (0)