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