1 #include "Halide.h"
2 
3 extern "C" unsigned char external_code_extern_bitcode_32[];
4 extern "C" int external_code_extern_bitcode_32_length;
5 extern "C" unsigned char external_code_extern_bitcode_64[];
6 extern "C" int external_code_extern_bitcode_64_length;
7 extern "C" unsigned char external_code_extern_cpp_source[];
8 extern "C" int external_code_extern_cpp_source_length;
9 
10 namespace {
11 
12 class ExternalCode : public Halide::Generator<ExternalCode> {
13 public:
14     GeneratorParam<bool> external_code_is_bitcode{"external_code_is_bitcode", true};
15     Input<Buffer<int32_t>> input{"input", 2};
16     Output<Buffer<float>> output{"output", 2};
17     HalidePureExtern_1(float, gen_extern_tester, float);
18 
generate()19     void generate() {
20         Var x("x"), y("y");
21         Func f("f");
22 
23         unsigned char *code;
24         int code_length;
25         const char *name = "org.halide-lang.extern_code_extern";
26         if (external_code_is_bitcode) {
27             Target target = get_target();
28             if (target.bits == 64) {
29                 code = external_code_extern_bitcode_64;
30                 code_length = external_code_extern_bitcode_64_length;
31             } else {
32                 code = external_code_extern_bitcode_32;
33                 code_length = external_code_extern_bitcode_32_length;
34             }
35             std::vector<uint8_t> code_vector(code, code + code_length);
36             get_externs_map()->insert({name,
37                                        Halide::ExternalCode::bitcode_wrapper(target, code_vector, name)});
38         } else {
39             code = external_code_extern_cpp_source;
40             code_length = external_code_extern_cpp_source_length;
41             std::vector<uint8_t> code_vector(code, code + code_length);
42             get_externs_map()->insert({name,
43                                        Halide::ExternalCode::c_plus_plus_code_wrapper(code_vector, name)});
44         }
45 
46         output(x, y) = gen_extern_tester(cast<float>(input(x, y)));
47     }
48 
schedule()49     void schedule() {
50     }
51 };
52 
53 }  // namespace
54 
55 HALIDE_REGISTER_GENERATOR(ExternalCode, external_code)
56