1 #include "Halide.h"
2 
3 class CPlusPlusNameManglingDefineExternGenerator : public Halide::Generator<CPlusPlusNameManglingDefineExternGenerator> {
4 public:
5     // Use all the parameter types to make sure mangling works for each of them.
6     Input<Func> input{"input", UInt(8), 1};
7     Input<int32_t *> int_ptr{"int_ptr", 0};
8     Input<int32_t const *> const_int_ptr{"const_int_ptr", 0};
9     Input<void *> void_ptr{"void_ptr", 0};
10     Input<void const *> const_void_ptr{"const_void_ptr", 0};
11     Input<std::string *> string_ptr{"string_ptr", 0};
12     Input<std::string const *> const_string_ptr{"const_string_ptr", 0};
13 
14     Output<Func> output1{"output", Float(64), 1};
15     Output<Func> output2{"output2", Float(64), 1};
16     Output<Func> output3{"output3", Float(64), 1};
17 
generate()18     void generate() {
19         assert(get_target().has_feature(Target::CPlusPlusMangling));
20         std::vector<ExternFuncArgument> args;
21         args.push_back(Halide::user_context_value());
22         args.push_back(input);
23         args.push_back(cast<int8_t>(1));
24         args.push_back(cast<uint8_t>(2));
25         args.push_back(cast<int16_t>(3));
26         args.push_back(cast<uint16_t>(4));
27         args.push_back(cast<int32_t>(5));
28         args.push_back(cast<uint32_t>(6));
29         args.push_back(cast<int64_t>(7));
30         args.push_back(cast<uint64_t>(8));
31         args.push_back(cast<bool>(9 == 9));
32         args.push_back(cast<float>(10.0f));
33         args.push_back(cast<double>(10.0f));
34         args.push_back(int_ptr);
35         args.push_back(const_int_ptr);
36         args.push_back(void_ptr);
37         args.push_back(const_void_ptr);
38         args.push_back(string_ptr);
39         args.push_back(const_string_ptr);
40         output1.define_extern("HalideTest::cxx_mangling_1",
41                               args, Float(64), 1, NameMangling::Default);
42         output2.define_extern("HalideTest::cxx_mangling_2",
43                               args, Float(64), 1, NameMangling::CPlusPlus);
44         output3.define_extern("cxx_mangling_3",
45                               args, Float(64), 1, NameMangling::C);
46     }
47 
schedule()48     void schedule() {
49         // nothing
50     }
51 };
52 
53 HALIDE_REGISTER_GENERATOR(CPlusPlusNameManglingDefineExternGenerator, cxx_mangling_define_extern)
54