// Generated with ../tools/gen_art_module_cc.sh


#pragma GCC diagnostic ignored "-Wframe-larger-than="
// TODO: Remove this pragma after llc can generate makeLLVMModuleContents()
// with smaller frame size.

#include <llvm/DerivedTypes.h>
#include <llvm/Function.h>
#include <llvm/Module.h>
#include <llvm/Type.h>

#include <vector>

using namespace llvm;

namespace art {
namespace compiler_llvm {


// Generated by llvm2cpp - DO NOT MODIFY!


Module* makeLLVMModuleContents(Module *mod) {

mod->setModuleIdentifier("art_module.ll");

// Type Definitions
std::vector<Type*>FuncTy_0_args;
StructType *StructTy_JavaObject = mod->getTypeByName("JavaObject");
if (!StructTy_JavaObject) {
StructTy_JavaObject = StructType::create(mod->getContext(), "JavaObject");
}
std::vector<Type*>StructTy_JavaObject_fields;
if (StructTy_JavaObject->isOpaque()) {
StructTy_JavaObject->setBody(StructTy_JavaObject_fields, /*isPacked=*/false);
}

PointerType* PointerTy_1 = PointerType::get(StructTy_JavaObject, 0);

FuncTy_0_args.push_back(PointerTy_1);
StructType *StructTy_ShadowFrame = mod->getTypeByName("ShadowFrame");
if (!StructTy_ShadowFrame) {
StructTy_ShadowFrame = StructType::create(mod->getContext(), "ShadowFrame");
}
std::vector<Type*>StructTy_ShadowFrame_fields;
StructTy_ShadowFrame_fields.push_back(IntegerType::get(mod->getContext(), 32));
PointerType* PointerTy_2 = PointerType::get(StructTy_ShadowFrame, 0);

StructTy_ShadowFrame_fields.push_back(PointerTy_2);
StructTy_ShadowFrame_fields.push_back(PointerTy_1);
StructTy_ShadowFrame_fields.push_back(IntegerType::get(mod->getContext(), 32));
if (StructTy_ShadowFrame->isOpaque()) {
StructTy_ShadowFrame->setBody(StructTy_ShadowFrame_fields, /*isPacked=*/false);
}


FuncTy_0_args.push_back(PointerTy_2);
FunctionType* FuncTy_0 = FunctionType::get(
 /*Result=*/Type::getVoidTy(mod->getContext()),
 /*Params=*/FuncTy_0_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_3_args;
FunctionType* FuncTy_3 = FunctionType::get(
 /*Result=*/PointerTy_1,
 /*Params=*/FuncTy_3_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_4_args;
FuncTy_4_args.push_back(PointerTy_1);
FunctionType* FuncTy_4 = FunctionType::get(
 /*Result=*/PointerTy_1,
 /*Params=*/FuncTy_4_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_5_args;
FuncTy_5_args.push_back(PointerTy_1);
FuncTy_5_args.push_back(PointerTy_1);
FunctionType* FuncTy_5 = FunctionType::get(
 /*Result=*/Type::getVoidTy(mod->getContext()),
 /*Params=*/FuncTy_5_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_6_args;
FuncTy_6_args.push_back(PointerTy_1);
FunctionType* FuncTy_6 = FunctionType::get(
 /*Result=*/Type::getVoidTy(mod->getContext()),
 /*Params=*/FuncTy_6_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_7_args;
FuncTy_7_args.push_back(PointerTy_1);
FuncTy_7_args.push_back(PointerTy_2);
FuncTy_7_args.push_back(PointerTy_1);
FuncTy_7_args.push_back(IntegerType::get(mod->getContext(), 32));
FunctionType* FuncTy_7 = FunctionType::get(
 /*Result=*/PointerTy_2,
 /*Params=*/FuncTy_7_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_8_args;
FuncTy_8_args.push_back(PointerTy_2);
FunctionType* FuncTy_8 = FunctionType::get(
 /*Result=*/Type::getVoidTy(mod->getContext()),
 /*Params=*/FuncTy_8_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_9_args;
FunctionType* FuncTy_9 = FunctionType::get(
 /*Result=*/Type::getVoidTy(mod->getContext()),
 /*Params=*/FuncTy_9_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_10_args;
FuncTy_10_args.push_back(IntegerType::get(mod->getContext(), 32));
FuncTy_10_args.push_back(IntegerType::get(mod->getContext(), 32));
FunctionType* FuncTy_10 = FunctionType::get(
 /*Result=*/Type::getVoidTy(mod->getContext()),
 /*Params=*/FuncTy_10_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_11_args;
FuncTy_11_args.push_back(IntegerType::get(mod->getContext(), 32));
FunctionType* FuncTy_11 = FunctionType::get(
 /*Result=*/Type::getVoidTy(mod->getContext()),
 /*Params=*/FuncTy_11_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_12_args;
FuncTy_12_args.push_back(PointerTy_1);
FuncTy_12_args.push_back(IntegerType::get(mod->getContext(), 32));
FunctionType* FuncTy_12 = FunctionType::get(
 /*Result=*/IntegerType::get(mod->getContext(), 32),
 /*Params=*/FuncTy_12_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_13_args;
FuncTy_13_args.push_back(IntegerType::get(mod->getContext(), 32));
FuncTy_13_args.push_back(PointerTy_1);
FuncTy_13_args.push_back(PointerTy_1);
FunctionType* FuncTy_13 = FunctionType::get(
 /*Result=*/PointerTy_1,
 /*Params=*/FuncTy_13_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_14_args;
FuncTy_14_args.push_back(IntegerType::get(mod->getContext(), 32));
FuncTy_14_args.push_back(PointerTy_1);
FuncTy_14_args.push_back(IntegerType::get(mod->getContext(), 32));
FuncTy_14_args.push_back(PointerTy_1);
FunctionType* FuncTy_14 = FunctionType::get(
 /*Result=*/PointerTy_1,
 /*Params=*/FuncTy_14_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_15_args;
FuncTy_15_args.push_back(IntegerType::get(mod->getContext(), 32));
FuncTy_15_args.push_back(PointerTy_1);
FunctionType* FuncTy_15 = FunctionType::get(
 /*Result=*/Type::getVoidTy(mod->getContext()),
 /*Params=*/FuncTy_15_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_16_args;
FuncTy_16_args.push_back(IntegerType::get(mod->getContext(), 32));
FuncTy_16_args.push_back(PointerTy_1);
FuncTy_16_args.push_back(PointerTy_1);
FuncTy_16_args.push_back(PointerTy_1);
FunctionType* FuncTy_16 = FunctionType::get(
 /*Result=*/PointerTy_1,
 /*Params=*/FuncTy_16_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_17_args;
FuncTy_17_args.push_back(PointerTy_1);
FuncTy_17_args.push_back(IntegerType::get(mod->getContext(), 32));
FunctionType* FuncTy_17 = FunctionType::get(
 /*Result=*/PointerTy_1,
 /*Params=*/FuncTy_17_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_18_args;
FuncTy_18_args.push_back(IntegerType::get(mod->getContext(), 32));
FuncTy_18_args.push_back(PointerTy_1);
FuncTy_18_args.push_back(IntegerType::get(mod->getContext(), 32));
FunctionType* FuncTy_18 = FunctionType::get(
 /*Result=*/IntegerType::get(mod->getContext(), 32),
 /*Params=*/FuncTy_18_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_19_args;
FuncTy_19_args.push_back(IntegerType::get(mod->getContext(), 32));
FuncTy_19_args.push_back(PointerTy_1);
FuncTy_19_args.push_back(IntegerType::get(mod->getContext(), 64));
FunctionType* FuncTy_19 = FunctionType::get(
 /*Result=*/IntegerType::get(mod->getContext(), 32),
 /*Params=*/FuncTy_19_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_20_args;
FuncTy_20_args.push_back(IntegerType::get(mod->getContext(), 32));
FuncTy_20_args.push_back(PointerTy_1);
FuncTy_20_args.push_back(PointerTy_1);
FunctionType* FuncTy_20 = FunctionType::get(
 /*Result=*/IntegerType::get(mod->getContext(), 32),
 /*Params=*/FuncTy_20_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_21_args;
FuncTy_21_args.push_back(IntegerType::get(mod->getContext(), 32));
FuncTy_21_args.push_back(PointerTy_1);
FunctionType* FuncTy_21 = FunctionType::get(
 /*Result=*/IntegerType::get(mod->getContext(), 32),
 /*Params=*/FuncTy_21_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_22_args;
FuncTy_22_args.push_back(IntegerType::get(mod->getContext(), 32));
FuncTy_22_args.push_back(PointerTy_1);
FunctionType* FuncTy_22 = FunctionType::get(
 /*Result=*/IntegerType::get(mod->getContext(), 64),
 /*Params=*/FuncTy_22_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_23_args;
FuncTy_23_args.push_back(IntegerType::get(mod->getContext(), 32));
FuncTy_23_args.push_back(PointerTy_1);
FunctionType* FuncTy_23 = FunctionType::get(
 /*Result=*/PointerTy_1,
 /*Params=*/FuncTy_23_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_24_args;
FuncTy_24_args.push_back(IntegerType::get(mod->getContext(), 32));
FuncTy_24_args.push_back(PointerTy_1);
FuncTy_24_args.push_back(PointerTy_1);
FuncTy_24_args.push_back(IntegerType::get(mod->getContext(), 32));
FunctionType* FuncTy_24 = FunctionType::get(
 /*Result=*/IntegerType::get(mod->getContext(), 32),
 /*Params=*/FuncTy_24_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_25_args;
FuncTy_25_args.push_back(IntegerType::get(mod->getContext(), 32));
FuncTy_25_args.push_back(PointerTy_1);
FuncTy_25_args.push_back(PointerTy_1);
FuncTy_25_args.push_back(IntegerType::get(mod->getContext(), 64));
FunctionType* FuncTy_25 = FunctionType::get(
 /*Result=*/IntegerType::get(mod->getContext(), 32),
 /*Params=*/FuncTy_25_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_26_args;
FuncTy_26_args.push_back(IntegerType::get(mod->getContext(), 32));
FuncTy_26_args.push_back(PointerTy_1);
FuncTy_26_args.push_back(PointerTy_1);
FuncTy_26_args.push_back(PointerTy_1);
FunctionType* FuncTy_26 = FunctionType::get(
 /*Result=*/IntegerType::get(mod->getContext(), 32),
 /*Params=*/FuncTy_26_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_27_args;
FuncTy_27_args.push_back(IntegerType::get(mod->getContext(), 32));
FuncTy_27_args.push_back(PointerTy_1);
FuncTy_27_args.push_back(PointerTy_1);
FunctionType* FuncTy_27 = FunctionType::get(
 /*Result=*/IntegerType::get(mod->getContext(), 64),
 /*Params=*/FuncTy_27_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_28_args;
FuncTy_28_args.push_back(PointerTy_1);
FuncTy_28_args.push_back(PointerTy_1);
FunctionType* FuncTy_28 = FunctionType::get(
 /*Result=*/PointerTy_1,
 /*Params=*/FuncTy_28_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_29_args;
FuncTy_29_args.push_back(PointerTy_1);
FuncTy_29_args.push_back(IntegerType::get(mod->getContext(), 32));
FuncTy_29_args.push_back(PointerTy_1);
FuncTy_29_args.push_back(IntegerType::get(mod->getContext(), 32));
FunctionType* FuncTy_29 = FunctionType::get(
 /*Result=*/Type::getVoidTy(mod->getContext()),
 /*Params=*/FuncTy_29_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_30_args;
FuncTy_30_args.push_back(PointerTy_1);
FuncTy_30_args.push_back(PointerTy_1);
FunctionType* FuncTy_30 = FunctionType::get(
 /*Result=*/IntegerType::get(mod->getContext(), 32),
 /*Params=*/FuncTy_30_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_31_args;
FuncTy_31_args.push_back(Type::getDoubleTy(mod->getContext()));
FunctionType* FuncTy_31 = FunctionType::get(
 /*Result=*/IntegerType::get(mod->getContext(), 64),
 /*Params=*/FuncTy_31_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_32_args;
FuncTy_32_args.push_back(Type::getDoubleTy(mod->getContext()));
FunctionType* FuncTy_32 = FunctionType::get(
 /*Result=*/IntegerType::get(mod->getContext(), 32),
 /*Params=*/FuncTy_32_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_33_args;
FuncTy_33_args.push_back(Type::getFloatTy(mod->getContext()));
FunctionType* FuncTy_33 = FunctionType::get(
 /*Result=*/IntegerType::get(mod->getContext(), 64),
 /*Params=*/FuncTy_33_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_34_args;
FuncTy_34_args.push_back(Type::getFloatTy(mod->getContext()));
FunctionType* FuncTy_34 = FunctionType::get(
 /*Result=*/IntegerType::get(mod->getContext(), 32),
 /*Params=*/FuncTy_34_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_35_args;
FuncTy_35_args.push_back(PointerTy_1);
FunctionType* FuncTy_35 = FunctionType::get(
 /*Result=*/IntegerType::get(mod->getContext(), 32),
 /*Params=*/FuncTy_35_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_36_args;
FuncTy_36_args.push_back(IntegerType::get(mod->getContext(), 32));
FuncTy_36_args.push_back(PointerTy_1);
FuncTy_36_args.push_back(PointerTy_1);
FunctionType* FuncTy_36 = FunctionType::get(
 /*Result=*/Type::getVoidTy(mod->getContext()),
 /*Params=*/FuncTy_36_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_37_args;
FuncTy_37_args.push_back(PointerTy_1);
FuncTy_37_args.push_back(IntegerType::get(mod->getContext(), 32));
FuncTy_37_args.push_back(PointerTy_1);
FunctionType* FuncTy_37 = FunctionType::get(
 /*Result=*/PointerTy_1,
 /*Params=*/FuncTy_37_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_38_args;
FuncTy_38_args.push_back(PointerTy_1);
FuncTy_38_args.push_back(IntegerType::get(mod->getContext(), 32));
FuncTy_38_args.push_back(PointerTy_1);
FuncTy_38_args.push_back(PointerTy_1);
FunctionType* FuncTy_38 = FunctionType::get(
 /*Result=*/PointerTy_1,
 /*Params=*/FuncTy_38_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_39_args;
FunctionType* FuncTy_39 = FunctionType::get(
 /*Result=*/IntegerType::get(mod->getContext(), 1),
 /*Params=*/FuncTy_39_args,
 /*isVarArg=*/false);

std::vector<Type*>FuncTy_40_args;
FuncTy_40_args.push_back(PointerTy_1);
FunctionType* FuncTy_40 = FunctionType::get(
 /*Result=*/Type::getVoidTy(mod->getContext()),
 /*Params=*/FuncTy_40_args,
 /*isVarArg=*/true);


// Function Declarations

Function* func___art_type_list = mod->getFunction("__art_type_list");
if (!func___art_type_list) {
func___art_type_list = Function::Create(
 /*Type=*/FuncTy_0,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"__art_type_list", mod); // (external, no body)
func___art_type_list->setCallingConv(CallingConv::C);
}
AttrListPtr func___art_type_list_PAL;
func___art_type_list->setAttributes(func___art_type_list_PAL);

Function* func_art_portable_get_current_thread_from_code = mod->getFunction("art_portable_get_current_thread_from_code");
if (!func_art_portable_get_current_thread_from_code) {
func_art_portable_get_current_thread_from_code = Function::Create(
 /*Type=*/FuncTy_3,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_get_current_thread_from_code", mod); // (external, no body)
func_art_portable_get_current_thread_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_get_current_thread_from_code_PAL;
func_art_portable_get_current_thread_from_code->setAttributes(func_art_portable_get_current_thread_from_code_PAL);

Function* func_art_portable_set_current_thread_from_code = mod->getFunction("art_portable_set_current_thread_from_code");
if (!func_art_portable_set_current_thread_from_code) {
func_art_portable_set_current_thread_from_code = Function::Create(
 /*Type=*/FuncTy_4,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_set_current_thread_from_code", mod); // (external, no body)
func_art_portable_set_current_thread_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_set_current_thread_from_code_PAL;
func_art_portable_set_current_thread_from_code->setAttributes(func_art_portable_set_current_thread_from_code_PAL);

Function* func_art_portable_lock_object_from_code = mod->getFunction("art_portable_lock_object_from_code");
if (!func_art_portable_lock_object_from_code) {
func_art_portable_lock_object_from_code = Function::Create(
 /*Type=*/FuncTy_5,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_lock_object_from_code", mod); // (external, no body)
func_art_portable_lock_object_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_lock_object_from_code_PAL;
func_art_portable_lock_object_from_code->setAttributes(func_art_portable_lock_object_from_code_PAL);

Function* func_art_portable_unlock_object_from_code = mod->getFunction("art_portable_unlock_object_from_code");
if (!func_art_portable_unlock_object_from_code) {
func_art_portable_unlock_object_from_code = Function::Create(
 /*Type=*/FuncTy_5,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_unlock_object_from_code", mod); // (external, no body)
func_art_portable_unlock_object_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_unlock_object_from_code_PAL;
func_art_portable_unlock_object_from_code->setAttributes(func_art_portable_unlock_object_from_code_PAL);

Function* func_art_portable_test_suspend_from_code = mod->getFunction("art_portable_test_suspend_from_code");
if (!func_art_portable_test_suspend_from_code) {
func_art_portable_test_suspend_from_code = Function::Create(
 /*Type=*/FuncTy_6,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_test_suspend_from_code", mod); // (external, no body)
func_art_portable_test_suspend_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_test_suspend_from_code_PAL;
func_art_portable_test_suspend_from_code->setAttributes(func_art_portable_test_suspend_from_code_PAL);

Function* func_art_portable_push_shadow_frame_from_code = mod->getFunction("art_portable_push_shadow_frame_from_code");
if (!func_art_portable_push_shadow_frame_from_code) {
func_art_portable_push_shadow_frame_from_code = Function::Create(
 /*Type=*/FuncTy_7,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_push_shadow_frame_from_code", mod); // (external, no body)
func_art_portable_push_shadow_frame_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_push_shadow_frame_from_code_PAL;
func_art_portable_push_shadow_frame_from_code->setAttributes(func_art_portable_push_shadow_frame_from_code_PAL);

Function* func_art_portable_pop_shadow_frame_from_code = mod->getFunction("art_portable_pop_shadow_frame_from_code");
if (!func_art_portable_pop_shadow_frame_from_code) {
func_art_portable_pop_shadow_frame_from_code = Function::Create(
 /*Type=*/FuncTy_8,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_pop_shadow_frame_from_code", mod); // (external, no body)
func_art_portable_pop_shadow_frame_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_pop_shadow_frame_from_code_PAL;
func_art_portable_pop_shadow_frame_from_code->setAttributes(func_art_portable_pop_shadow_frame_from_code_PAL);

Function* func_art_portable_get_and_clear_exception = mod->getFunction("art_portable_get_and_clear_exception");
if (!func_art_portable_get_and_clear_exception) {
func_art_portable_get_and_clear_exception = Function::Create(
 /*Type=*/FuncTy_4,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_get_and_clear_exception", mod); // (external, no body)
func_art_portable_get_and_clear_exception->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_get_and_clear_exception_PAL;
func_art_portable_get_and_clear_exception->setAttributes(func_art_portable_get_and_clear_exception_PAL);

Function* func_art_portable_throw_div_zero_from_code = mod->getFunction("art_portable_throw_div_zero_from_code");
if (!func_art_portable_throw_div_zero_from_code) {
func_art_portable_throw_div_zero_from_code = Function::Create(
 /*Type=*/FuncTy_9,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_throw_div_zero_from_code", mod); // (external, no body)
func_art_portable_throw_div_zero_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_throw_div_zero_from_code_PAL;
func_art_portable_throw_div_zero_from_code->setAttributes(func_art_portable_throw_div_zero_from_code_PAL);

Function* func_art_portable_throw_array_bounds_from_code = mod->getFunction("art_portable_throw_array_bounds_from_code");
if (!func_art_portable_throw_array_bounds_from_code) {
func_art_portable_throw_array_bounds_from_code = Function::Create(
 /*Type=*/FuncTy_10,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_throw_array_bounds_from_code", mod); // (external, no body)
func_art_portable_throw_array_bounds_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_throw_array_bounds_from_code_PAL;
func_art_portable_throw_array_bounds_from_code->setAttributes(func_art_portable_throw_array_bounds_from_code_PAL);

Function* func_art_portable_throw_no_such_method_from_code = mod->getFunction("art_portable_throw_no_such_method_from_code");
if (!func_art_portable_throw_no_such_method_from_code) {
func_art_portable_throw_no_such_method_from_code = Function::Create(
 /*Type=*/FuncTy_11,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_throw_no_such_method_from_code", mod); // (external, no body)
func_art_portable_throw_no_such_method_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_throw_no_such_method_from_code_PAL;
func_art_portable_throw_no_such_method_from_code->setAttributes(func_art_portable_throw_no_such_method_from_code_PAL);

Function* func_art_portable_throw_null_pointer_exception_from_code = mod->getFunction("art_portable_throw_null_pointer_exception_from_code");
if (!func_art_portable_throw_null_pointer_exception_from_code) {
func_art_portable_throw_null_pointer_exception_from_code = Function::Create(
 /*Type=*/FuncTy_11,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_throw_null_pointer_exception_from_code", mod); // (external, no body)
func_art_portable_throw_null_pointer_exception_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_throw_null_pointer_exception_from_code_PAL;
func_art_portable_throw_null_pointer_exception_from_code->setAttributes(func_art_portable_throw_null_pointer_exception_from_code_PAL);

Function* func_art_portable_throw_stack_overflow_from_code = mod->getFunction("art_portable_throw_stack_overflow_from_code");
if (!func_art_portable_throw_stack_overflow_from_code) {
func_art_portable_throw_stack_overflow_from_code = Function::Create(
 /*Type=*/FuncTy_9,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_throw_stack_overflow_from_code", mod); // (external, no body)
func_art_portable_throw_stack_overflow_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_throw_stack_overflow_from_code_PAL;
func_art_portable_throw_stack_overflow_from_code->setAttributes(func_art_portable_throw_stack_overflow_from_code_PAL);

Function* func_art_portable_throw_exception_from_code = mod->getFunction("art_portable_throw_exception_from_code");
if (!func_art_portable_throw_exception_from_code) {
func_art_portable_throw_exception_from_code = Function::Create(
 /*Type=*/FuncTy_6,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_throw_exception_from_code", mod); // (external, no body)
func_art_portable_throw_exception_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_throw_exception_from_code_PAL;
func_art_portable_throw_exception_from_code->setAttributes(func_art_portable_throw_exception_from_code_PAL);

Function* func_art_portable_find_catch_block_from_code = mod->getFunction("art_portable_find_catch_block_from_code");
if (!func_art_portable_find_catch_block_from_code) {
func_art_portable_find_catch_block_from_code = Function::Create(
 /*Type=*/FuncTy_12,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_find_catch_block_from_code", mod); // (external, no body)
func_art_portable_find_catch_block_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_find_catch_block_from_code_PAL;
func_art_portable_find_catch_block_from_code->setAttributes(func_art_portable_find_catch_block_from_code_PAL);

Function* func_art_portable_alloc_object_from_code = mod->getFunction("art_portable_alloc_object_from_code");
if (!func_art_portable_alloc_object_from_code) {
func_art_portable_alloc_object_from_code = Function::Create(
 /*Type=*/FuncTy_13,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_alloc_object_from_code", mod); // (external, no body)
func_art_portable_alloc_object_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_alloc_object_from_code_PAL;
func_art_portable_alloc_object_from_code->setAttributes(func_art_portable_alloc_object_from_code_PAL);

Function* func_art_portable_alloc_object_from_code_with_access_check = mod->getFunction("art_portable_alloc_object_from_code_with_access_check");
if (!func_art_portable_alloc_object_from_code_with_access_check) {
func_art_portable_alloc_object_from_code_with_access_check = Function::Create(
 /*Type=*/FuncTy_13,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_alloc_object_from_code_with_access_check", mod); // (external, no body)
func_art_portable_alloc_object_from_code_with_access_check->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_alloc_object_from_code_with_access_check_PAL;
func_art_portable_alloc_object_from_code_with_access_check->setAttributes(func_art_portable_alloc_object_from_code_with_access_check_PAL);

Function* func_art_portable_alloc_array_from_code = mod->getFunction("art_portable_alloc_array_from_code");
if (!func_art_portable_alloc_array_from_code) {
func_art_portable_alloc_array_from_code = Function::Create(
 /*Type=*/FuncTy_14,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_alloc_array_from_code", mod); // (external, no body)
func_art_portable_alloc_array_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_alloc_array_from_code_PAL;
func_art_portable_alloc_array_from_code->setAttributes(func_art_portable_alloc_array_from_code_PAL);

Function* func_art_portable_alloc_array_from_code_with_access_check = mod->getFunction("art_portable_alloc_array_from_code_with_access_check");
if (!func_art_portable_alloc_array_from_code_with_access_check) {
func_art_portable_alloc_array_from_code_with_access_check = Function::Create(
 /*Type=*/FuncTy_14,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_alloc_array_from_code_with_access_check", mod); // (external, no body)
func_art_portable_alloc_array_from_code_with_access_check->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_alloc_array_from_code_with_access_check_PAL;
func_art_portable_alloc_array_from_code_with_access_check->setAttributes(func_art_portable_alloc_array_from_code_with_access_check_PAL);

Function* func_art_portable_check_and_alloc_array_from_code = mod->getFunction("art_portable_check_and_alloc_array_from_code");
if (!func_art_portable_check_and_alloc_array_from_code) {
func_art_portable_check_and_alloc_array_from_code = Function::Create(
 /*Type=*/FuncTy_14,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_check_and_alloc_array_from_code", mod); // (external, no body)
func_art_portable_check_and_alloc_array_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_check_and_alloc_array_from_code_PAL;
func_art_portable_check_and_alloc_array_from_code->setAttributes(func_art_portable_check_and_alloc_array_from_code_PAL);

Function* func_art_portable_check_and_alloc_array_from_code_with_access_check = mod->getFunction("art_portable_check_and_alloc_array_from_code_with_access_check");
if (!func_art_portable_check_and_alloc_array_from_code_with_access_check) {
func_art_portable_check_and_alloc_array_from_code_with_access_check = Function::Create(
 /*Type=*/FuncTy_14,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_check_and_alloc_array_from_code_with_access_check", mod); // (external, no body)
func_art_portable_check_and_alloc_array_from_code_with_access_check->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_check_and_alloc_array_from_code_with_access_check_PAL;
func_art_portable_check_and_alloc_array_from_code_with_access_check->setAttributes(func_art_portable_check_and_alloc_array_from_code_with_access_check_PAL);

Function* func_art_portable_find_instance_field_from_code = mod->getFunction("art_portable_find_instance_field_from_code");
if (!func_art_portable_find_instance_field_from_code) {
func_art_portable_find_instance_field_from_code = Function::Create(
 /*Type=*/FuncTy_15,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_find_instance_field_from_code", mod); // (external, no body)
func_art_portable_find_instance_field_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_find_instance_field_from_code_PAL;
func_art_portable_find_instance_field_from_code->setAttributes(func_art_portable_find_instance_field_from_code_PAL);

Function* func_art_portable_find_static_field_from_code = mod->getFunction("art_portable_find_static_field_from_code");
if (!func_art_portable_find_static_field_from_code) {
func_art_portable_find_static_field_from_code = Function::Create(
 /*Type=*/FuncTy_15,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_find_static_field_from_code", mod); // (external, no body)
func_art_portable_find_static_field_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_find_static_field_from_code_PAL;
func_art_portable_find_static_field_from_code->setAttributes(func_art_portable_find_static_field_from_code_PAL);

Function* func_art_portable_find_static_method_from_code_with_access_check = mod->getFunction("art_portable_find_static_method_from_code_with_access_check");
if (!func_art_portable_find_static_method_from_code_with_access_check) {
func_art_portable_find_static_method_from_code_with_access_check = Function::Create(
 /*Type=*/FuncTy_16,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_find_static_method_from_code_with_access_check", mod); // (external, no body)
func_art_portable_find_static_method_from_code_with_access_check->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_find_static_method_from_code_with_access_check_PAL;
func_art_portable_find_static_method_from_code_with_access_check->setAttributes(func_art_portable_find_static_method_from_code_with_access_check_PAL);

Function* func_art_portable_find_direct_method_from_code_with_access_check = mod->getFunction("art_portable_find_direct_method_from_code_with_access_check");
if (!func_art_portable_find_direct_method_from_code_with_access_check) {
func_art_portable_find_direct_method_from_code_with_access_check = Function::Create(
 /*Type=*/FuncTy_16,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_find_direct_method_from_code_with_access_check", mod); // (external, no body)
func_art_portable_find_direct_method_from_code_with_access_check->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_find_direct_method_from_code_with_access_check_PAL;
func_art_portable_find_direct_method_from_code_with_access_check->setAttributes(func_art_portable_find_direct_method_from_code_with_access_check_PAL);

Function* func_art_portable_find_virtual_method_from_code_with_access_check = mod->getFunction("art_portable_find_virtual_method_from_code_with_access_check");
if (!func_art_portable_find_virtual_method_from_code_with_access_check) {
func_art_portable_find_virtual_method_from_code_with_access_check = Function::Create(
 /*Type=*/FuncTy_16,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_find_virtual_method_from_code_with_access_check", mod); // (external, no body)
func_art_portable_find_virtual_method_from_code_with_access_check->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_find_virtual_method_from_code_with_access_check_PAL;
func_art_portable_find_virtual_method_from_code_with_access_check->setAttributes(func_art_portable_find_virtual_method_from_code_with_access_check_PAL);

Function* func_art_portable_find_super_method_from_code_with_access_check = mod->getFunction("art_portable_find_super_method_from_code_with_access_check");
if (!func_art_portable_find_super_method_from_code_with_access_check) {
func_art_portable_find_super_method_from_code_with_access_check = Function::Create(
 /*Type=*/FuncTy_16,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_find_super_method_from_code_with_access_check", mod); // (external, no body)
func_art_portable_find_super_method_from_code_with_access_check->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_find_super_method_from_code_with_access_check_PAL;
func_art_portable_find_super_method_from_code_with_access_check->setAttributes(func_art_portable_find_super_method_from_code_with_access_check_PAL);

Function* func_art_portable_find_interface_method_from_code_with_access_check = mod->getFunction("art_portable_find_interface_method_from_code_with_access_check");
if (!func_art_portable_find_interface_method_from_code_with_access_check) {
func_art_portable_find_interface_method_from_code_with_access_check = Function::Create(
 /*Type=*/FuncTy_16,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_find_interface_method_from_code_with_access_check", mod); // (external, no body)
func_art_portable_find_interface_method_from_code_with_access_check->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_find_interface_method_from_code_with_access_check_PAL;
func_art_portable_find_interface_method_from_code_with_access_check->setAttributes(func_art_portable_find_interface_method_from_code_with_access_check_PAL);

Function* func_art_portable_find_interface_method_from_code = mod->getFunction("art_portable_find_interface_method_from_code");
if (!func_art_portable_find_interface_method_from_code) {
func_art_portable_find_interface_method_from_code = Function::Create(
 /*Type=*/FuncTy_16,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_find_interface_method_from_code", mod); // (external, no body)
func_art_portable_find_interface_method_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_find_interface_method_from_code_PAL;
func_art_portable_find_interface_method_from_code->setAttributes(func_art_portable_find_interface_method_from_code_PAL);

Function* func_art_portable_initialize_static_storage_from_code = mod->getFunction("art_portable_initialize_static_storage_from_code");
if (!func_art_portable_initialize_static_storage_from_code) {
func_art_portable_initialize_static_storage_from_code = Function::Create(
 /*Type=*/FuncTy_13,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_initialize_static_storage_from_code", mod); // (external, no body)
func_art_portable_initialize_static_storage_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_initialize_static_storage_from_code_PAL;
func_art_portable_initialize_static_storage_from_code->setAttributes(func_art_portable_initialize_static_storage_from_code_PAL);

Function* func_art_portable_initialize_type_from_code = mod->getFunction("art_portable_initialize_type_from_code");
if (!func_art_portable_initialize_type_from_code) {
func_art_portable_initialize_type_from_code = Function::Create(
 /*Type=*/FuncTy_13,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_initialize_type_from_code", mod); // (external, no body)
func_art_portable_initialize_type_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_initialize_type_from_code_PAL;
func_art_portable_initialize_type_from_code->setAttributes(func_art_portable_initialize_type_from_code_PAL);

Function* func_art_portable_initialize_type_and_verify_access_from_code = mod->getFunction("art_portable_initialize_type_and_verify_access_from_code");
if (!func_art_portable_initialize_type_and_verify_access_from_code) {
func_art_portable_initialize_type_and_verify_access_from_code = Function::Create(
 /*Type=*/FuncTy_13,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_initialize_type_and_verify_access_from_code", mod); // (external, no body)
func_art_portable_initialize_type_and_verify_access_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_initialize_type_and_verify_access_from_code_PAL;
func_art_portable_initialize_type_and_verify_access_from_code->setAttributes(func_art_portable_initialize_type_and_verify_access_from_code_PAL);

Function* func_art_portable_resolve_string_from_code = mod->getFunction("art_portable_resolve_string_from_code");
if (!func_art_portable_resolve_string_from_code) {
func_art_portable_resolve_string_from_code = Function::Create(
 /*Type=*/FuncTy_17,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_resolve_string_from_code", mod); // (external, no body)
func_art_portable_resolve_string_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_resolve_string_from_code_PAL;
func_art_portable_resolve_string_from_code->setAttributes(func_art_portable_resolve_string_from_code_PAL);

Function* func_art_portable_set32_static_from_code = mod->getFunction("art_portable_set32_static_from_code");
if (!func_art_portable_set32_static_from_code) {
func_art_portable_set32_static_from_code = Function::Create(
 /*Type=*/FuncTy_18,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_set32_static_from_code", mod); // (external, no body)
func_art_portable_set32_static_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_set32_static_from_code_PAL;
func_art_portable_set32_static_from_code->setAttributes(func_art_portable_set32_static_from_code_PAL);

Function* func_art_portable_set64_static_from_code = mod->getFunction("art_portable_set64_static_from_code");
if (!func_art_portable_set64_static_from_code) {
func_art_portable_set64_static_from_code = Function::Create(
 /*Type=*/FuncTy_19,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_set64_static_from_code", mod); // (external, no body)
func_art_portable_set64_static_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_set64_static_from_code_PAL;
func_art_portable_set64_static_from_code->setAttributes(func_art_portable_set64_static_from_code_PAL);

Function* func_art_portable_set_obj_static_from_code = mod->getFunction("art_portable_set_obj_static_from_code");
if (!func_art_portable_set_obj_static_from_code) {
func_art_portable_set_obj_static_from_code = Function::Create(
 /*Type=*/FuncTy_20,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_set_obj_static_from_code", mod); // (external, no body)
func_art_portable_set_obj_static_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_set_obj_static_from_code_PAL;
func_art_portable_set_obj_static_from_code->setAttributes(func_art_portable_set_obj_static_from_code_PAL);

Function* func_art_portable_get32_static_from_code = mod->getFunction("art_portable_get32_static_from_code");
if (!func_art_portable_get32_static_from_code) {
func_art_portable_get32_static_from_code = Function::Create(
 /*Type=*/FuncTy_21,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_get32_static_from_code", mod); // (external, no body)
func_art_portable_get32_static_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_get32_static_from_code_PAL;
func_art_portable_get32_static_from_code->setAttributes(func_art_portable_get32_static_from_code_PAL);

Function* func_art_portable_get64_static_from_code = mod->getFunction("art_portable_get64_static_from_code");
if (!func_art_portable_get64_static_from_code) {
func_art_portable_get64_static_from_code = Function::Create(
 /*Type=*/FuncTy_22,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_get64_static_from_code", mod); // (external, no body)
func_art_portable_get64_static_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_get64_static_from_code_PAL;
func_art_portable_get64_static_from_code->setAttributes(func_art_portable_get64_static_from_code_PAL);

Function* func_art_portable_get_obj_static_from_code = mod->getFunction("art_portable_get_obj_static_from_code");
if (!func_art_portable_get_obj_static_from_code) {
func_art_portable_get_obj_static_from_code = Function::Create(
 /*Type=*/FuncTy_23,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_get_obj_static_from_code", mod); // (external, no body)
func_art_portable_get_obj_static_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_get_obj_static_from_code_PAL;
func_art_portable_get_obj_static_from_code->setAttributes(func_art_portable_get_obj_static_from_code_PAL);

Function* func_art_portable_set32_instance_from_code = mod->getFunction("art_portable_set32_instance_from_code");
if (!func_art_portable_set32_instance_from_code) {
func_art_portable_set32_instance_from_code = Function::Create(
 /*Type=*/FuncTy_24,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_set32_instance_from_code", mod); // (external, no body)
func_art_portable_set32_instance_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_set32_instance_from_code_PAL;
func_art_portable_set32_instance_from_code->setAttributes(func_art_portable_set32_instance_from_code_PAL);

Function* func_art_portable_set64_instance_from_code = mod->getFunction("art_portable_set64_instance_from_code");
if (!func_art_portable_set64_instance_from_code) {
func_art_portable_set64_instance_from_code = Function::Create(
 /*Type=*/FuncTy_25,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_set64_instance_from_code", mod); // (external, no body)
func_art_portable_set64_instance_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_set64_instance_from_code_PAL;
func_art_portable_set64_instance_from_code->setAttributes(func_art_portable_set64_instance_from_code_PAL);

Function* func_art_portable_set_obj_instance_from_code = mod->getFunction("art_portable_set_obj_instance_from_code");
if (!func_art_portable_set_obj_instance_from_code) {
func_art_portable_set_obj_instance_from_code = Function::Create(
 /*Type=*/FuncTy_26,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_set_obj_instance_from_code", mod); // (external, no body)
func_art_portable_set_obj_instance_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_set_obj_instance_from_code_PAL;
func_art_portable_set_obj_instance_from_code->setAttributes(func_art_portable_set_obj_instance_from_code_PAL);

Function* func_art_portable_get32_instance_from_code = mod->getFunction("art_portable_get32_instance_from_code");
if (!func_art_portable_get32_instance_from_code) {
func_art_portable_get32_instance_from_code = Function::Create(
 /*Type=*/FuncTy_20,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_get32_instance_from_code", mod); // (external, no body)
func_art_portable_get32_instance_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_get32_instance_from_code_PAL;
func_art_portable_get32_instance_from_code->setAttributes(func_art_portable_get32_instance_from_code_PAL);

Function* func_art_portable_get64_instance_from_code = mod->getFunction("art_portable_get64_instance_from_code");
if (!func_art_portable_get64_instance_from_code) {
func_art_portable_get64_instance_from_code = Function::Create(
 /*Type=*/FuncTy_27,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_get64_instance_from_code", mod); // (external, no body)
func_art_portable_get64_instance_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_get64_instance_from_code_PAL;
func_art_portable_get64_instance_from_code->setAttributes(func_art_portable_get64_instance_from_code_PAL);

Function* func_art_portable_get_obj_instance_from_code = mod->getFunction("art_portable_get_obj_instance_from_code");
if (!func_art_portable_get_obj_instance_from_code) {
func_art_portable_get_obj_instance_from_code = Function::Create(
 /*Type=*/FuncTy_13,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_get_obj_instance_from_code", mod); // (external, no body)
func_art_portable_get_obj_instance_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_get_obj_instance_from_code_PAL;
func_art_portable_get_obj_instance_from_code->setAttributes(func_art_portable_get_obj_instance_from_code_PAL);

Function* func_art_portable_decode_jobject_in_thread = mod->getFunction("art_portable_decode_jobject_in_thread");
if (!func_art_portable_decode_jobject_in_thread) {
func_art_portable_decode_jobject_in_thread = Function::Create(
 /*Type=*/FuncTy_28,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_decode_jobject_in_thread", mod); // (external, no body)
func_art_portable_decode_jobject_in_thread->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_decode_jobject_in_thread_PAL;
func_art_portable_decode_jobject_in_thread->setAttributes(func_art_portable_decode_jobject_in_thread_PAL);

Function* func_art_portable_fill_array_data_from_code = mod->getFunction("art_portable_fill_array_data_from_code");
if (!func_art_portable_fill_array_data_from_code) {
func_art_portable_fill_array_data_from_code = Function::Create(
 /*Type=*/FuncTy_29,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_fill_array_data_from_code", mod); // (external, no body)
func_art_portable_fill_array_data_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_fill_array_data_from_code_PAL;
func_art_portable_fill_array_data_from_code->setAttributes(func_art_portable_fill_array_data_from_code_PAL);

Function* func_art_portable_is_assignable_from_code = mod->getFunction("art_portable_is_assignable_from_code");
if (!func_art_portable_is_assignable_from_code) {
func_art_portable_is_assignable_from_code = Function::Create(
 /*Type=*/FuncTy_30,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_is_assignable_from_code", mod); // (external, no body)
func_art_portable_is_assignable_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_is_assignable_from_code_PAL;
func_art_portable_is_assignable_from_code->setAttributes(func_art_portable_is_assignable_from_code_PAL);

Function* func_art_portable_check_cast_from_code = mod->getFunction("art_portable_check_cast_from_code");
if (!func_art_portable_check_cast_from_code) {
func_art_portable_check_cast_from_code = Function::Create(
 /*Type=*/FuncTy_5,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_check_cast_from_code", mod); // (external, no body)
func_art_portable_check_cast_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_check_cast_from_code_PAL;
func_art_portable_check_cast_from_code->setAttributes(func_art_portable_check_cast_from_code_PAL);

Function* func_art_portable_check_put_array_element_from_code = mod->getFunction("art_portable_check_put_array_element_from_code");
if (!func_art_portable_check_put_array_element_from_code) {
func_art_portable_check_put_array_element_from_code = Function::Create(
 /*Type=*/FuncTy_5,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_check_put_array_element_from_code", mod); // (external, no body)
func_art_portable_check_put_array_element_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_check_put_array_element_from_code_PAL;
func_art_portable_check_put_array_element_from_code->setAttributes(func_art_portable_check_put_array_element_from_code_PAL);

Function* func_art_d2l = mod->getFunction("art_d2l");
if (!func_art_d2l) {
func_art_d2l = Function::Create(
 /*Type=*/FuncTy_31,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_d2l", mod); // (external, no body)
func_art_d2l->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_d2l_PAL;
func_art_d2l->setAttributes(func_art_d2l_PAL);

Function* func_art_d2i = mod->getFunction("art_d2i");
if (!func_art_d2i) {
func_art_d2i = Function::Create(
 /*Type=*/FuncTy_32,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_d2i", mod); // (external, no body)
func_art_d2i->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_d2i_PAL;
func_art_d2i->setAttributes(func_art_d2i_PAL);

Function* func_art_f2l = mod->getFunction("art_f2l");
if (!func_art_f2l) {
func_art_f2l = Function::Create(
 /*Type=*/FuncTy_33,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_f2l", mod); // (external, no body)
func_art_f2l->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_f2l_PAL;
func_art_f2l->setAttributes(func_art_f2l_PAL);

Function* func_art_f2i = mod->getFunction("art_f2i");
if (!func_art_f2i) {
func_art_f2i = Function::Create(
 /*Type=*/FuncTy_34,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_f2i", mod); // (external, no body)
func_art_f2i->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_f2i_PAL;
func_art_f2i->setAttributes(func_art_f2i_PAL);

Function* func_art_portable_jni_method_start = mod->getFunction("art_portable_jni_method_start");
if (!func_art_portable_jni_method_start) {
func_art_portable_jni_method_start = Function::Create(
 /*Type=*/FuncTy_35,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_jni_method_start", mod); // (external, no body)
func_art_portable_jni_method_start->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_jni_method_start_PAL;
func_art_portable_jni_method_start->setAttributes(func_art_portable_jni_method_start_PAL);

Function* func_art_portable_jni_method_start_synchronized = mod->getFunction("art_portable_jni_method_start_synchronized");
if (!func_art_portable_jni_method_start_synchronized) {
func_art_portable_jni_method_start_synchronized = Function::Create(
 /*Type=*/FuncTy_30,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_jni_method_start_synchronized", mod); // (external, no body)
func_art_portable_jni_method_start_synchronized->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_jni_method_start_synchronized_PAL;
func_art_portable_jni_method_start_synchronized->setAttributes(func_art_portable_jni_method_start_synchronized_PAL);

Function* func_art_portable_jni_method_end = mod->getFunction("art_portable_jni_method_end");
if (!func_art_portable_jni_method_end) {
func_art_portable_jni_method_end = Function::Create(
 /*Type=*/FuncTy_15,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_jni_method_end", mod); // (external, no body)
func_art_portable_jni_method_end->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_jni_method_end_PAL;
func_art_portable_jni_method_end->setAttributes(func_art_portable_jni_method_end_PAL);

Function* func_art_portable_jni_method_end_synchronized = mod->getFunction("art_portable_jni_method_end_synchronized");
if (!func_art_portable_jni_method_end_synchronized) {
func_art_portable_jni_method_end_synchronized = Function::Create(
 /*Type=*/FuncTy_36,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_jni_method_end_synchronized", mod); // (external, no body)
func_art_portable_jni_method_end_synchronized->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_jni_method_end_synchronized_PAL;
func_art_portable_jni_method_end_synchronized->setAttributes(func_art_portable_jni_method_end_synchronized_PAL);

Function* func_art_portable_jni_method_end_with_reference = mod->getFunction("art_portable_jni_method_end_with_reference");
if (!func_art_portable_jni_method_end_with_reference) {
func_art_portable_jni_method_end_with_reference = Function::Create(
 /*Type=*/FuncTy_37,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_jni_method_end_with_reference", mod); // (external, no body)
func_art_portable_jni_method_end_with_reference->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_jni_method_end_with_reference_PAL;
func_art_portable_jni_method_end_with_reference->setAttributes(func_art_portable_jni_method_end_with_reference_PAL);

Function* func_art_portable_jni_method_end_with_reference_synchronized = mod->getFunction("art_portable_jni_method_end_with_reference_synchronized");
if (!func_art_portable_jni_method_end_with_reference_synchronized) {
func_art_portable_jni_method_end_with_reference_synchronized = Function::Create(
 /*Type=*/FuncTy_38,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_jni_method_end_with_reference_synchronized", mod); // (external, no body)
func_art_portable_jni_method_end_with_reference_synchronized->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_jni_method_end_with_reference_synchronized_PAL;
func_art_portable_jni_method_end_with_reference_synchronized->setAttributes(func_art_portable_jni_method_end_with_reference_synchronized_PAL);

Function* func_art_portable_is_exception_pending_from_code = mod->getFunction("art_portable_is_exception_pending_from_code");
if (!func_art_portable_is_exception_pending_from_code) {
func_art_portable_is_exception_pending_from_code = Function::Create(
 /*Type=*/FuncTy_39,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_is_exception_pending_from_code", mod); // (external, no body)
func_art_portable_is_exception_pending_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_is_exception_pending_from_code_PAL;
func_art_portable_is_exception_pending_from_code->setAttributes(func_art_portable_is_exception_pending_from_code_PAL);

Function* func_art_portable_mark_gc_card_from_code = mod->getFunction("art_portable_mark_gc_card_from_code");
if (!func_art_portable_mark_gc_card_from_code) {
func_art_portable_mark_gc_card_from_code = Function::Create(
 /*Type=*/FuncTy_5,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_mark_gc_card_from_code", mod); // (external, no body)
func_art_portable_mark_gc_card_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_mark_gc_card_from_code_PAL;
func_art_portable_mark_gc_card_from_code->setAttributes(func_art_portable_mark_gc_card_from_code_PAL);

Function* func_art_portable_proxy_invoke_handler_from_code = mod->getFunction("art_portable_proxy_invoke_handler_from_code");
if (!func_art_portable_proxy_invoke_handler_from_code) {
func_art_portable_proxy_invoke_handler_from_code = Function::Create(
 /*Type=*/FuncTy_40,
 /*Linkage=*/GlobalValue::ExternalLinkage,
 /*Name=*/"art_portable_proxy_invoke_handler_from_code", mod); // (external, no body)
func_art_portable_proxy_invoke_handler_from_code->setCallingConv(CallingConv::C);
}
AttrListPtr func_art_portable_proxy_invoke_handler_from_code_PAL;
func_art_portable_proxy_invoke_handler_from_code->setAttributes(func_art_portable_proxy_invoke_handler_from_code_PAL);

// Global Variable Declarations


// Constant Definitions

// Global Variable Definitions

// Function Definitions

return mod;

}

} // namespace compiler_llvm
} // namespace art
