diff --git a/python_bindings/src/PyEnums.cpp b/python_bindings/src/PyEnums.cpp index f232b43c4c59..d518030eb860 100644 --- a/python_bindings/src/PyEnums.cpp +++ b/python_bindings/src/PyEnums.cpp @@ -22,6 +22,7 @@ void define_enums(py::module &m) { py::enum_(m, "LinkageType") .value("External", LinkageType::External) .value("ExternalPlusMetadata", LinkageType::ExternalPlusMetadata) + .value("ExternalPlusArgv", LinkageType::ExternalPlusArgv) .value("Internal", LinkageType::Internal); py::enum_(m, "LoopAlignStrategy") diff --git a/src/CodeGen_C.cpp b/src/CodeGen_C.cpp index 545268c9283c..50a25f6748f4 100644 --- a/src/CodeGen_C.cpp +++ b/src/CodeGen_C.cpp @@ -1888,11 +1888,13 @@ void CodeGen_C::compile(const LoweredFunc &f, const std::map CodeGen_LLVM::compile(const Module &input) { // If the Func is externally visible, also create the argv wrapper and metadata. // (useful for calling from JIT and other machine interfaces). - if (f.linkage == LinkageType::ExternalPlusMetadata) { + if (f.linkage == LinkageType::ExternalPlusArgv || f.linkage == LinkageType::ExternalPlusMetadata) { llvm::Function *wrapper = add_argv_wrapper(function, names.argv_name); - llvm::Function *metadata_getter = embed_metadata_getter(names.metadata_name, - names.simple_name, f.args, input.get_metadata_name_map()); + if (f.linkage == LinkageType::ExternalPlusMetadata) { + llvm::Function *metadata_getter = embed_metadata_getter(names.metadata_name, + names.simple_name, f.args, input.get_metadata_name_map()); - if (target.has_feature(Target::Matlab)) { - define_matlab_wrapper(module.get(), wrapper, metadata_getter); + if (target.has_feature(Target::Matlab)) { + define_matlab_wrapper(module.get(), wrapper, metadata_getter); + } } } } diff --git a/src/HexagonOffload.cpp b/src/HexagonOffload.cpp index 9d4512ce3d0d..cd680d62519e 100644 --- a/src/HexagonOffload.cpp +++ b/src/HexagonOffload.cpp @@ -846,7 +846,8 @@ class InjectHexagonRpc : public IRMutator { LoweredArgument arg(i.first, Argument::InputScalar, i.second, 0, ArgumentEstimates{}); args.push_back(arg); } - device_code.append(LoweredFunc(hex_name, args, body, LinkageType::ExternalPlusMetadata)); + // We need the _argv function but not the _metadata. + device_code.append(LoweredFunc(hex_name, args, body, LinkageType::ExternalPlusArgv)); // Generate a call to hexagon_device_run. std::vector arg_sizes; diff --git a/src/IRPrinter.cpp b/src/IRPrinter.cpp index 0b546f3a62fa..41b30a23fde4 100644 --- a/src/IRPrinter.cpp +++ b/src/IRPrinter.cpp @@ -365,6 +365,9 @@ ostream &operator<<(ostream &stream, const LoweredFunc &function) { std::ostream &operator<<(std::ostream &stream, const LinkageType &type) { switch (type) { + case LinkageType::ExternalPlusArgv: + stream << "external_plus_argv"; + break; case LinkageType::ExternalPlusMetadata: stream << "external_plus_metadata"; break; diff --git a/src/Module.h b/src/Module.h index 8e8c1b8cb4ef..aed88a344057 100644 --- a/src/Module.h +++ b/src/Module.h @@ -48,6 +48,7 @@ enum class Output { enum class LinkageType { External, ///< Visible externally. ExternalPlusMetadata, ///< Visible externally. Argument metadata and an argv wrapper are also generated. + ExternalPlusArgv, ///< Visible externally. Argv wrapper is generated but *not* argument metadata. Internal, ///< Not visible externally, similar to 'static' linkage in C. };