// Generated with ./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/IR/DerivedTypes.h>
#include <llvm/IR/Function.h>
#include <llvm/IR/Module.h>
#include <llvm/IR/Type.h>

#include <vector>

using namespace llvm;

namespace art {
namespace 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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);
}
AttributeSet 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 llvm
}  // namespace art
