aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/CodeGen/CodeGenFunction.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/CodeGen/CodeGenFunction.cpp')
-rw-r--r--clang/lib/CodeGen/CodeGenFunction.cpp109
1 files changed, 38 insertions, 71 deletions
diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp
index ef6bb4f..f8138e9 100644
--- a/clang/lib/CodeGen/CodeGenFunction.cpp
+++ b/clang/lib/CodeGen/CodeGenFunction.cpp
@@ -2828,23 +2828,17 @@ void CodeGenFunction::EmitKCFIOperandBundle(
Bundles.emplace_back("kcfi", CGM.CreateKCFITypeId(FP->desugar()));
}
-llvm::Value *CodeGenFunction::FormAArch64ResolverCondition(
- const MultiVersionResolverOption &RO) {
- llvm::SmallVector<StringRef, 8> CondFeatures;
- for (const StringRef &Feature : RO.Conditions.Features)
- CondFeatures.push_back(Feature);
- if (!CondFeatures.empty()) {
- return EmitAArch64CpuSupports(CondFeatures);
- }
- return nullptr;
+llvm::Value *
+CodeGenFunction::FormAArch64ResolverCondition(const FMVResolverOption &RO) {
+ return RO.Features.empty() ? nullptr : EmitAArch64CpuSupports(RO.Features);
}
-llvm::Value *CodeGenFunction::FormX86ResolverCondition(
- const MultiVersionResolverOption &RO) {
+llvm::Value *
+CodeGenFunction::FormX86ResolverCondition(const FMVResolverOption &RO) {
llvm::Value *Condition = nullptr;
- if (!RO.Conditions.Architecture.empty()) {
- StringRef Arch = RO.Conditions.Architecture;
+ if (RO.Architecture) {
+ StringRef Arch = *RO.Architecture;
// If arch= specifies an x86-64 micro-architecture level, test the feature
// with __builtin_cpu_supports, otherwise use __builtin_cpu_is.
if (Arch.starts_with("x86-64"))
@@ -2853,8 +2847,8 @@ llvm::Value *CodeGenFunction::FormX86ResolverCondition(
Condition = EmitX86CpuIs(Arch);
}
- if (!RO.Conditions.Features.empty()) {
- llvm::Value *FeatureCond = EmitX86CpuSupports(RO.Conditions.Features);
+ if (!RO.Features.empty()) {
+ llvm::Value *FeatureCond = EmitX86CpuSupports(RO.Features);
Condition =
Condition ? Builder.CreateAnd(Condition, FeatureCond) : FeatureCond;
}
@@ -2884,7 +2878,7 @@ static void CreateMultiVersionResolverReturn(CodeGenModule &CGM,
}
void CodeGenFunction::EmitMultiVersionResolver(
- llvm::Function *Resolver, ArrayRef<MultiVersionResolverOption> Options) {
+ llvm::Function *Resolver, ArrayRef<FMVResolverOption> Options) {
llvm::Triple::ArchType ArchType =
getContext().getTargetInfo().getTriple().getArch();
@@ -2907,26 +2901,8 @@ void CodeGenFunction::EmitMultiVersionResolver(
}
}
-static unsigned getPriorityFromAttrString(StringRef AttrStr) {
- SmallVector<StringRef, 8> Attrs;
-
- AttrStr.split(Attrs, ';');
-
- // Default Priority is zero.
- unsigned Priority = 0;
- for (auto Attr : Attrs) {
- if (Attr.consume_front("priority=")) {
- unsigned Result;
- if (!Attr.getAsInteger(0, Result))
- Priority = Result;
- }
- }
-
- return Priority;
-}
-
void CodeGenFunction::EmitRISCVMultiVersionResolver(
- llvm::Function *Resolver, ArrayRef<MultiVersionResolverOption> Options) {
+ llvm::Function *Resolver, ArrayRef<FMVResolverOption> Options) {
if (getContext().getTargetInfo().getTriple().getOS() !=
llvm::Triple::OSType::Linux) {
@@ -2942,20 +2918,10 @@ void CodeGenFunction::EmitRISCVMultiVersionResolver(
bool HasDefault = false;
unsigned DefaultIndex = 0;
- SmallVector<CodeGenFunction::MultiVersionResolverOption, 10> CurrOptions(
- Options);
-
- llvm::stable_sort(
- CurrOptions, [](const CodeGenFunction::MultiVersionResolverOption &LHS,
- const CodeGenFunction::MultiVersionResolverOption &RHS) {
- return getPriorityFromAttrString(LHS.Conditions.Features[0]) >
- getPriorityFromAttrString(RHS.Conditions.Features[0]);
- });
-
// Check the each candidate function.
- for (unsigned Index = 0; Index < CurrOptions.size(); Index++) {
+ for (unsigned Index = 0; Index < Options.size(); Index++) {
- if (CurrOptions[Index].Conditions.Features[0].starts_with("default")) {
+ if (Options[Index].Features.empty()) {
HasDefault = true;
DefaultIndex = Index;
continue;
@@ -2963,15 +2929,6 @@ void CodeGenFunction::EmitRISCVMultiVersionResolver(
Builder.SetInsertPoint(CurBlock);
- std::vector<std::string> TargetAttrFeats =
- getContext()
- .getTargetInfo()
- .parseTargetAttr(CurrOptions[Index].Conditions.Features[0])
- .Features;
-
- if (TargetAttrFeats.empty())
- continue;
-
// FeaturesCondition: The bitmask of the required extension has been
// enabled by the runtime object.
// (__riscv_feature_bits.features[i] & REQUIRED_BITMASK) ==
@@ -2994,20 +2951,32 @@ void CodeGenFunction::EmitRISCVMultiVersionResolver(
// Without checking the length first, we may access an incorrect memory
// address when using different versions.
llvm::SmallVector<StringRef, 8> CurrTargetAttrFeats;
+ llvm::SmallVector<std::string, 8> TargetAttrFeats;
- for (auto &Feat : TargetAttrFeats) {
- StringRef CurrFeat = Feat;
- if (CurrFeat.starts_with('+'))
- CurrTargetAttrFeats.push_back(CurrFeat.substr(1));
+ for (StringRef Feat : Options[Index].Features) {
+ std::vector<std::string> FeatStr =
+ getContext().getTargetInfo().parseTargetAttr(Feat).Features;
+
+ assert(FeatStr.size() == 1 && "Feature string not delimited");
+
+ std::string &CurrFeat = FeatStr.front();
+ if (CurrFeat[0] == '+')
+ TargetAttrFeats.push_back(CurrFeat.substr(1));
}
+ if (TargetAttrFeats.empty())
+ continue;
+
+ for (std::string &Feat : TargetAttrFeats)
+ CurrTargetAttrFeats.push_back(Feat);
+
Builder.SetInsertPoint(CurBlock);
llvm::Value *FeatsCondition = EmitRISCVCpuSupports(CurrTargetAttrFeats);
llvm::BasicBlock *RetBlock = createBasicBlock("resolver_return", Resolver);
CGBuilderTy RetBuilder(*this, RetBlock);
- CreateMultiVersionResolverReturn(
- CGM, Resolver, RetBuilder, CurrOptions[Index].Function, SupportsIFunc);
+ CreateMultiVersionResolverReturn(CGM, Resolver, RetBuilder,
+ Options[Index].Function, SupportsIFunc);
llvm::BasicBlock *ElseBlock = createBasicBlock("resolver_else", Resolver);
Builder.SetInsertPoint(CurBlock);
@@ -3019,9 +2988,8 @@ void CodeGenFunction::EmitRISCVMultiVersionResolver(
// Finally, emit the default one.
if (HasDefault) {
Builder.SetInsertPoint(CurBlock);
- CreateMultiVersionResolverReturn(CGM, Resolver, Builder,
- CurrOptions[DefaultIndex].Function,
- SupportsIFunc);
+ CreateMultiVersionResolverReturn(
+ CGM, Resolver, Builder, Options[DefaultIndex].Function, SupportsIFunc);
return;
}
@@ -3035,17 +3003,16 @@ void CodeGenFunction::EmitRISCVMultiVersionResolver(
}
void CodeGenFunction::EmitAArch64MultiVersionResolver(
- llvm::Function *Resolver, ArrayRef<MultiVersionResolverOption> Options) {
+ llvm::Function *Resolver, ArrayRef<FMVResolverOption> Options) {
assert(!Options.empty() && "No multiversion resolver options found");
- assert(Options.back().Conditions.Features.size() == 0 &&
- "Default case must be last");
+ assert(Options.back().Features.size() == 0 && "Default case must be last");
bool SupportsIFunc = getContext().getTargetInfo().supportsIFunc();
assert(SupportsIFunc &&
"Multiversion resolver requires target IFUNC support");
bool AArch64CpuInitialized = false;
llvm::BasicBlock *CurBlock = createBasicBlock("resolver_entry", Resolver);
- for (const MultiVersionResolverOption &RO : Options) {
+ for (const FMVResolverOption &RO : Options) {
Builder.SetInsertPoint(CurBlock);
llvm::Value *Condition = FormAArch64ResolverCondition(RO);
@@ -3081,7 +3048,7 @@ void CodeGenFunction::EmitAArch64MultiVersionResolver(
}
void CodeGenFunction::EmitX86MultiVersionResolver(
- llvm::Function *Resolver, ArrayRef<MultiVersionResolverOption> Options) {
+ llvm::Function *Resolver, ArrayRef<FMVResolverOption> Options) {
bool SupportsIFunc = getContext().getTargetInfo().supportsIFunc();
@@ -3090,7 +3057,7 @@ void CodeGenFunction::EmitX86MultiVersionResolver(
Builder.SetInsertPoint(CurBlock);
EmitX86CpuInit();
- for (const MultiVersionResolverOption &RO : Options) {
+ for (const FMVResolverOption &RO : Options) {
Builder.SetInsertPoint(CurBlock);
llvm::Value *Condition = FormX86ResolverCondition(RO);