brintos

brintos / llvm-project-archived public Read only

0
0
Text · 15.0 KiB · beebbb2 Raw
398 lines · c
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --function-signature --check-attributes --check-globals --include-generated-funcs --global-value-regex ".*"2// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -emit-llvm -o - %s | FileCheck %s3 4 5// Test that an ifunc is generated and used when the default6// version is defined after the first use of the function.7__attribute__((target_version("aes"))) void used_before_default_def(void) {}8void call_before_def(void) { used_before_default_def(); }9__attribute__((target_version("default"))) void used_before_default_def(void) {}10 11 12// Test that an ifunc is generated and used when the default13// version is defined before the first use of the function.14__attribute__((target_version("aes"))) void used_after_default_def(void) {}15__attribute__((target_version("default"))) void used_after_default_def(void) {}16void call_after_def(void) { used_after_default_def(); }17 18 19// Test that an unmagled declaration is generated and used when the20// default version is declared after the first use of the function.21__attribute__((target_version("aes"))) void used_before_default_decl(void) {}22void call_before_decl(void) { used_before_default_decl(); }23__attribute__((target_version("default"))) void used_before_default_decl(void);24 25 26// Test that an unmagled declaration is generated and used when the27// default version is declared before the first use of the function.28__attribute__((target_version("aes"))) void used_after_default_decl(void) {}29__attribute__((target_version("default"))) void used_after_default_decl(void);30void call_after_decl(void) { used_after_default_decl(); }31 32 33// Test that an unmagled declaration is generated and used when34// the default version is not present.35__attribute__((target_version("aes"))) void used_no_default(void) {}36void call_no_default(void) { used_no_default(); }37 38 39// Test that neither an ifunc nor a declaration is generated if the default40// definition is missing since the versioned function is not used.41__attribute__((target_version("aes"))) void not_used_no_default(void) {}42 43 44// Test that an ifunc is generated if the default version is defined but not used.45__attribute__((target_version("aes"))) void not_used_with_default(void) {}46__attribute__((target_version("default"))) void not_used_with_default(void) {}47 48 49// Test that the ifunc symbol can be used for indirect calls.50__attribute__((target_version("aes"))) void indirect_use(void) {}51__attribute__((target_version("default"))) void indirect_use(void) {}52typedef void (*fptr)(void);53void call_indirectly(void) {54  fptr fn = indirect_use;55  fn();56}57 58 59// Test that an internal ifunc is generated if the versions are annotated with static inline.60static inline __attribute__((target_version("aes"))) void internal_func(void) {}61static inline __attribute__((target_version("default"))) void internal_func(void) {}62void call_internal(void) { internal_func(); }63 64 65// Test that an ifunc is generated with if the versions are annotated with inline.66inline __attribute__((target_version("aes"))) void linkonce_func(void) {}67inline __attribute__((target_version("default"))) void linkonce_func(void) {}68void call_linkonce(void) { linkonce_func(); }69 70 71// Test that an ifunc is generated when the clones attribute has a default version.72__attribute__((target_clones("default", "aes"))) void clones_with_default(void) {}73 74 75// Test that an ifunc is NOT generated when the clones attribute does not have a default version.76__attribute__((target_clones("aes"))) void clones_without_default(void) {}77 78 79//.80// CHECK: @__aarch64_cpu_features = external dso_local global { i64 }81// CHECK: @used_before_default_def = weak_odr ifunc void (), ptr @used_before_default_def.resolver82// CHECK: @used_after_default_def = weak_odr ifunc void (), ptr @used_after_default_def.resolver83// CHECK: @not_used_with_default = weak_odr ifunc void (), ptr @not_used_with_default.resolver84// CHECK: @indirect_use = weak_odr ifunc void (), ptr @indirect_use.resolver85// CHECK: @internal_func = internal ifunc void (), ptr @internal_func.resolver86// CHECK: @linkonce_func = weak_odr ifunc void (), ptr @linkonce_func.resolver87// CHECK: @clones_with_default = weak_odr ifunc void (), ptr @clones_with_default.resolver88//.89// CHECK: Function Attrs: noinline nounwind optnone90// CHECK-LABEL: define {{[^@]+}}@used_before_default_def._Maes91// CHECK-SAME: () #[[ATTR0:[0-9]+]] {92// CHECK-NEXT:  entry:93// CHECK-NEXT:    ret void94//95//96// CHECK: Function Attrs: noinline nounwind optnone97// CHECK-LABEL: define {{[^@]+}}@call_before_def98// CHECK-SAME: () #[[ATTR1:[0-9]+]] {99// CHECK-NEXT:  entry:100// CHECK-NEXT:    call void @used_before_default_def()101// CHECK-NEXT:    ret void102//103//104// CHECK: Function Attrs: noinline nounwind optnone105// CHECK-LABEL: define {{[^@]+}}@used_before_default_def.default106// CHECK-SAME: () #[[ATTR2:[0-9]+]] {107// CHECK-NEXT:  entry:108// CHECK-NEXT:    ret void109//110//111// CHECK: Function Attrs: noinline nounwind optnone112// CHECK-LABEL: define {{[^@]+}}@used_after_default_def._Maes113// CHECK-SAME: () #[[ATTR0]] {114// CHECK-NEXT:  entry:115// CHECK-NEXT:    ret void116//117//118// CHECK: Function Attrs: noinline nounwind optnone119// CHECK-LABEL: define {{[^@]+}}@used_after_default_def.default120// CHECK-SAME: () #[[ATTR2]] {121// CHECK-NEXT:  entry:122// CHECK-NEXT:    ret void123//124//125// CHECK: Function Attrs: noinline nounwind optnone126// CHECK-LABEL: define {{[^@]+}}@call_after_def127// CHECK-SAME: () #[[ATTR1]] {128// CHECK-NEXT:  entry:129// CHECK-NEXT:    call void @used_after_default_def()130// CHECK-NEXT:    ret void131//132//133// CHECK: Function Attrs: noinline nounwind optnone134// CHECK-LABEL: define {{[^@]+}}@used_before_default_decl._Maes135// CHECK-SAME: () #[[ATTR0]] {136// CHECK-NEXT:  entry:137// CHECK-NEXT:    ret void138//139//140// CHECK: Function Attrs: noinline nounwind optnone141// CHECK-LABEL: define {{[^@]+}}@call_before_decl142// CHECK-SAME: () #[[ATTR1]] {143// CHECK-NEXT:  entry:144// CHECK-NEXT:    call void @used_before_default_decl()145// CHECK-NEXT:    ret void146//147//148// CHECK: Function Attrs: noinline nounwind optnone149// CHECK-LABEL: define {{[^@]+}}@used_after_default_decl._Maes150// CHECK-SAME: () #[[ATTR0]] {151// CHECK-NEXT:  entry:152// CHECK-NEXT:    ret void153//154//155// CHECK: Function Attrs: noinline nounwind optnone156// CHECK-LABEL: define {{[^@]+}}@call_after_decl157// CHECK-SAME: () #[[ATTR1]] {158// CHECK-NEXT:  entry:159// CHECK-NEXT:    call void @used_after_default_decl()160// CHECK-NEXT:    ret void161//162//163// CHECK: Function Attrs: noinline nounwind optnone164// CHECK-LABEL: define {{[^@]+}}@used_no_default._Maes165// CHECK-SAME: () #[[ATTR0]] {166// CHECK-NEXT:  entry:167// CHECK-NEXT:    ret void168//169//170// CHECK: Function Attrs: noinline nounwind optnone171// CHECK-LABEL: define {{[^@]+}}@call_no_default172// CHECK-SAME: () #[[ATTR1]] {173// CHECK-NEXT:  entry:174// CHECK-NEXT:    call void @used_no_default()175// CHECK-NEXT:    ret void176//177//178// CHECK: Function Attrs: noinline nounwind optnone179// CHECK-LABEL: define {{[^@]+}}@not_used_no_default._Maes180// CHECK-SAME: () #[[ATTR0]] {181// CHECK-NEXT:  entry:182// CHECK-NEXT:    ret void183//184//185// CHECK: Function Attrs: noinline nounwind optnone186// CHECK-LABEL: define {{[^@]+}}@not_used_with_default._Maes187// CHECK-SAME: () #[[ATTR0]] {188// CHECK-NEXT:  entry:189// CHECK-NEXT:    ret void190//191//192// CHECK: Function Attrs: noinline nounwind optnone193// CHECK-LABEL: define {{[^@]+}}@not_used_with_default.default194// CHECK-SAME: () #[[ATTR2]] {195// CHECK-NEXT:  entry:196// CHECK-NEXT:    ret void197//198//199// CHECK: Function Attrs: noinline nounwind optnone200// CHECK-LABEL: define {{[^@]+}}@indirect_use._Maes201// CHECK-SAME: () #[[ATTR0]] {202// CHECK-NEXT:  entry:203// CHECK-NEXT:    ret void204//205//206// CHECK: Function Attrs: noinline nounwind optnone207// CHECK-LABEL: define {{[^@]+}}@indirect_use.default208// CHECK-SAME: () #[[ATTR2]] {209// CHECK-NEXT:  entry:210// CHECK-NEXT:    ret void211//212//213// CHECK: Function Attrs: noinline nounwind optnone214// CHECK-LABEL: define {{[^@]+}}@call_indirectly215// CHECK-SAME: () #[[ATTR1]] {216// CHECK-NEXT:  entry:217// CHECK-NEXT:    [[FN:%.*]] = alloca ptr, align 8218// CHECK-NEXT:    store ptr @indirect_use, ptr [[FN]], align 8219// CHECK-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[FN]], align 8220// CHECK-NEXT:    call void [[TMP0]]()221// CHECK-NEXT:    ret void222//223//224// CHECK: Function Attrs: noinline nounwind optnone225// CHECK-LABEL: define {{[^@]+}}@call_internal226// CHECK-SAME: () #[[ATTR1]] {227// CHECK-NEXT:  entry:228// CHECK-NEXT:    call void @internal_func()229// CHECK-NEXT:    ret void230//231//232// CHECK: Function Attrs: noinline nounwind optnone233// CHECK-LABEL: define {{[^@]+}}@call_linkonce234// CHECK-SAME: () #[[ATTR1]] {235// CHECK-NEXT:  entry:236// CHECK-NEXT:    call void @linkonce_func()237// CHECK-NEXT:    ret void238//239//240// CHECK: Function Attrs: noinline nounwind optnone241// CHECK-LABEL: define {{[^@]+}}@clones_with_default.default242// CHECK-SAME: () #[[ATTR2]] {243// CHECK-NEXT:  entry:244// CHECK-NEXT:    ret void245//246//247// CHECK: Function Attrs: noinline nounwind optnone248// CHECK-LABEL: define {{[^@]+}}@clones_with_default._Maes249// CHECK-SAME: () #[[ATTR0]] {250// CHECK-NEXT:  entry:251// CHECK-NEXT:    ret void252//253//254// CHECK: Function Attrs: noinline nounwind optnone255// CHECK-LABEL: define {{[^@]+}}@clones_without_default._Maes256// CHECK-SAME: () #[[ATTR0]] {257// CHECK-NEXT:  entry:258// CHECK-NEXT:    ret void259//260//261// CHECK-LABEL: define {{[^@]+}}@used_before_default_def.resolver()262// CHECK-SAME: #[[ATTR_RESOLVER:[0-9]+]] comdat {263// CHECK-NEXT:  resolver_entry:264// CHECK-NEXT:    call void @__init_cpu_features_resolver()265// CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8266// CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 33536267// CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 33536268// CHECK-NEXT:    [[TMP3:%.*]] = and i1 true, [[TMP2]]269// CHECK-NEXT:    br i1 [[TMP3]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]270// CHECK:       resolver_return:271// CHECK-NEXT:    ret ptr @used_before_default_def._Maes272// CHECK:       resolver_else:273// CHECK-NEXT:    ret ptr @used_before_default_def.default274//275//276// CHECK-LABEL: define {{[^@]+}}@used_after_default_def.resolver()277// CHECK-SAME: #[[ATTR_RESOLVER]] comdat {278// CHECK-NEXT:  resolver_entry:279// CHECK-NEXT:    call void @__init_cpu_features_resolver()280// CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8281// CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 33536282// CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 33536283// CHECK-NEXT:    [[TMP3:%.*]] = and i1 true, [[TMP2]]284// CHECK-NEXT:    br i1 [[TMP3]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]285// CHECK:       resolver_return:286// CHECK-NEXT:    ret ptr @used_after_default_def._Maes287// CHECK:       resolver_else:288// CHECK-NEXT:    ret ptr @used_after_default_def.default289//290//291// CHECK-LABEL: define {{[^@]+}}@not_used_with_default.resolver()292// CHECK-SAME: #[[ATTR_RESOLVER]] comdat {293// CHECK-NEXT:  resolver_entry:294// CHECK-NEXT:    call void @__init_cpu_features_resolver()295// CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8296// CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 33536297// CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 33536298// CHECK-NEXT:    [[TMP3:%.*]] = and i1 true, [[TMP2]]299// CHECK-NEXT:    br i1 [[TMP3]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]300// CHECK:       resolver_return:301// CHECK-NEXT:    ret ptr @not_used_with_default._Maes302// CHECK:       resolver_else:303// CHECK-NEXT:    ret ptr @not_used_with_default.default304//305//306// CHECK-LABEL: define {{[^@]+}}@indirect_use.resolver()307// CHECK-SAME: #[[ATTR_RESOLVER]] comdat {308// CHECK-NEXT:  resolver_entry:309// CHECK-NEXT:    call void @__init_cpu_features_resolver()310// CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8311// CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 33536312// CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 33536313// CHECK-NEXT:    [[TMP3:%.*]] = and i1 true, [[TMP2]]314// CHECK-NEXT:    br i1 [[TMP3]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]315// CHECK:       resolver_return:316// CHECK-NEXT:    ret ptr @indirect_use._Maes317// CHECK:       resolver_else:318// CHECK-NEXT:    ret ptr @indirect_use.default319//320//321// CHECK: Function Attrs: noinline nounwind optnone322// CHECK-LABEL: define {{[^@]+}}@internal_func._Maes323// CHECK-SAME: () #[[ATTR0]] {324// CHECK-NEXT:  entry:325// CHECK-NEXT:    ret void326//327//328// CHECK: Function Attrs: noinline nounwind optnone329// CHECK-LABEL: define {{[^@]+}}@internal_func.default330// CHECK-SAME: () #[[ATTR2]] {331// CHECK-NEXT:  entry:332// CHECK-NEXT:    ret void333//334//335// CHECK-LABEL: define {{[^@]+}}@internal_func.resolver()336// CHECK-SAME: #[[ATTR_RESOLVER]] {337// CHECK-NEXT:  resolver_entry:338// CHECK-NEXT:    call void @__init_cpu_features_resolver()339// CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8340// CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 33536341// CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 33536342// CHECK-NEXT:    [[TMP3:%.*]] = and i1 true, [[TMP2]]343// CHECK-NEXT:    br i1 [[TMP3]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]344// CHECK:       resolver_return:345// CHECK-NEXT:    ret ptr @internal_func._Maes346// CHECK:       resolver_else:347// CHECK-NEXT:    ret ptr @internal_func.default348//349//350// CHECK: Function Attrs: noinline nounwind optnone351// CHECK-LABEL: define {{[^@]+}}@linkonce_func._Maes352// CHECK-SAME: () #[[ATTR0]] {353// CHECK-NEXT:  entry:354// CHECK-NEXT:    ret void355//356//357// CHECK: Function Attrs: noinline nounwind optnone358// CHECK-LABEL: define {{[^@]+}}@linkonce_func.default359// CHECK-SAME: () #[[ATTR2]] {360// CHECK-NEXT:  entry:361// CHECK-NEXT:    ret void362//363//364// CHECK-LABEL: define {{[^@]+}}@linkonce_func.resolver()365// CHECK-SAME: #[[ATTR_RESOLVER]] comdat {366// CHECK-NEXT:  resolver_entry:367// CHECK-NEXT:    call void @__init_cpu_features_resolver()368// CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8369// CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 33536370// CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 33536371// CHECK-NEXT:    [[TMP3:%.*]] = and i1 true, [[TMP2]]372// CHECK-NEXT:    br i1 [[TMP3]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]373// CHECK:       resolver_return:374// CHECK-NEXT:    ret ptr @linkonce_func._Maes375// CHECK:       resolver_else:376// CHECK-NEXT:    ret ptr @linkonce_func.default377//378//379// CHECK-LABEL: define {{[^@]+}}@clones_with_default.resolver()380// CHECK-SAME: #[[ATTR_RESOLVER]] comdat {381// CHECK-NEXT:  resolver_entry:382// CHECK-NEXT:    call void @__init_cpu_features_resolver()383// CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8384// CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 33536385// CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 33536386// CHECK-NEXT:    [[TMP3:%.*]] = and i1 true, [[TMP2]]387// CHECK-NEXT:    br i1 [[TMP3]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]388// CHECK:       resolver_return:389// CHECK-NEXT:    ret ptr @clones_with_default._Maes390// CHECK:       resolver_else:391// CHECK-NEXT:    ret ptr @clones_with_default.default392//393// CHECK: attributes #[[ATTR_RESOLVER]] = { disable_sanitizer_instrumentation }394//.395// CHECK: [[META0:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}396// CHECK: [[META1:![0-9]+]] = !{!"{{.*}}clang version {{.*}}"}397//.398