diff options
Diffstat (limited to 'clang/test')
-rw-r--r-- | clang/test/CodeGen/attr-target-mv.c | 53 | ||||
-rw-r--r-- | clang/test/Sema/attr-target-mv.c | 3 |
2 files changed, 53 insertions, 3 deletions
diff --git a/clang/test/CodeGen/attr-target-mv.c b/clang/test/CodeGen/attr-target-mv.c index f9fbbbd5f0b..e22499e2928 100644 --- a/clang/test/CodeGen/attr-target-mv.c +++ b/clang/test/CodeGen/attr-target-mv.c @@ -35,10 +35,24 @@ void bar4() { foo_multi(1, 5.0); } +int fwd_decl_default(void); +int __attribute__((target("default"))) fwd_decl_default(void) { return 2; } + +int fwd_decl_avx(void); +int __attribute__((target("avx"))) fwd_decl_avx(void) { return 2; } +int __attribute__((target("default"))) fwd_decl_avx(void) { return 2; } + +void bar5() { + fwd_decl_default(); + fwd_decl_avx(); +} + // LINUX: @foo.ifunc = ifunc i32 (), i32 ()* ()* @foo.resolver // LINUX: @foo_inline.ifunc = ifunc i32 (), i32 ()* ()* @foo_inline.resolver // LINUX: @foo_decls.ifunc = ifunc void (), void ()* ()* @foo_decls.resolver // LINUX: @foo_multi.ifunc = ifunc void (i32, double), void (i32, double)* ()* @foo_multi.resolver +// LINUX: @fwd_decl_default.ifunc = ifunc i32 (), i32 ()* ()* @fwd_decl_default.resolver +// LINUX: @fwd_decl_avx.ifunc = ifunc i32 (), i32 ()* ()* @fwd_decl_avx.resolver // LINUX: define i32 @foo.sse4.2() // LINUX: ret i32 0 @@ -168,8 +182,45 @@ void bar4() { // WINDOWS: call void @foo_multi(i32 %0, double %1) // WINDOWS-NEXT: ret void -// LINUX: declare i32 @foo.arch_sandybridge() +// LINUX: define i32 @fwd_decl_default() +// LINUX: ret i32 2 +// LINUX: define i32 @fwd_decl_avx.avx() +// LINUX: ret i32 2 +// LINUX: define i32 @fwd_decl_avx() +// LINUX: ret i32 2 +// WINDOWS: define dso_local i32 @fwd_decl_default() +// WINDOWS: ret i32 2 +// WINDOWS: define dso_local i32 @fwd_decl_avx.avx() +// WINDOWS: ret i32 2 +// WINDOWS: define dso_local i32 @fwd_decl_avx() +// WINDOWS: ret i32 2 + +// LINUX: define void @bar5() +// LINUX: call i32 @fwd_decl_default.ifunc() +// LINUX: call i32 @fwd_decl_avx.ifunc() + +// WINDOWS: define dso_local void @bar5() +// WINDOWS: call i32 @fwd_decl_default.resolver() +// WINDOWS: call i32 @fwd_decl_avx.resolver() + +// LINUX: define i32 ()* @fwd_decl_default.resolver() comdat +// LINUX: call void @__cpu_indicator_init() +// LINUX: ret i32 ()* @fwd_decl_default +// LINUX: define i32 ()* @fwd_decl_avx.resolver() comdat +// LINUX: call void @__cpu_indicator_init() +// LINUX: ret i32 ()* @fwd_decl_avx.avx +// LINUX: ret i32 ()* @fwd_decl_avx + +// WINDOWS: define dso_local i32 @fwd_decl_default.resolver() comdat +// WINDOWS: call void @__cpu_indicator_init() +// WINDOWS: call i32 @fwd_decl_default +// WINDOWS: define dso_local i32 @fwd_decl_avx.resolver() comdat +// WINDOWS: call void @__cpu_indicator_init() +// WINDOWS: call i32 @fwd_decl_avx.avx +// WINDOWS: call i32 @fwd_decl_avx + +// LINUX: declare i32 @foo.arch_sandybridge() // WINDOWS: declare dso_local i32 @foo.arch_sandybridge() // LINUX: define linkonce i32 @foo_inline.sse4.2() diff --git a/clang/test/Sema/attr-target-mv.c b/clang/test/Sema/attr-target-mv.c index 671adff5b04..664ade1c0fa 100644 --- a/clang/test/Sema/attr-target-mv.c +++ b/clang/test/Sema/attr-target-mv.c @@ -65,10 +65,9 @@ int __attribute__((target("sse4.2,arch=sandybridge"))) mangle(void) { return 1; //expected-note@-2 {{previous declaration is here}} int __attribute__((target("arch=sandybridge,sse4.2"))) mangle(void) { return 2; } +// allow this, since we want to treat the 1st one as fwd-decl of the sandybridge version. int prev_no_target(void); int __attribute__((target("arch=sandybridge"))) prev_no_target(void) { return 2; } -// expected-error@-2 {{function declaration is missing 'target' attribute in a multiversioned function}} -// expected-note@+1 {{function multiversioning caused by this declaration}} int __attribute__((target("arch=ivybridge"))) prev_no_target(void) { return 2; } int __attribute__((target("arch=sandybridge"))) prev_no_target2(void); |