1 #include "Jitter_CodeGenFactory.h"
2 
3 #ifdef _WIN32
4 
5 	#ifdef _M_X64
6 		#include "Jitter_CodeGen_x86_64.h"
7 	#else
8 		#include "Jitter_CodeGen_x86_32.h"
9 	#endif
10 
11 #elif defined(__APPLE__)
12 
13 	#include <TargetConditionals.h>
14 	#if TARGET_CPU_ARM
15 		#include "Jitter_CodeGen_AArch32.h"
16 	#elif TARGET_CPU_ARM64
17 		#include "Jitter_CodeGen_AArch64.h"
18 	#elif TARGET_CPU_X86
19 		#include "Jitter_CodeGen_x86_32.h"
20 	#elif TARGET_CPU_X86_64
21 		#include "Jitter_CodeGen_x86_64.h"
22 	#else
23 		#warning Architecture not supported
24 	#endif
25 
26 #elif defined(__ANDROID__) || defined(__linux__) || defined(__FreeBSD__)
27 
28 	#if defined(__arm__)
29 		#include "Jitter_CodeGen_AArch32.h"
30 	#elif defined(__aarch64__)
31 		#include "Jitter_CodeGen_AArch64.h"
32 	#elif defined(__i386__)
33 		#include "Jitter_CodeGen_x86_32.h"
34 	#elif defined(__x86_64__)
35 		#include "Jitter_CodeGen_x86_64.h"
36 	#else
37 		#warning Architecture not supported
38 	#endif
39 
40 #endif
41 
CreateCodeGen()42 Jitter::CCodeGen* Jitter::CreateCodeGen()
43 {
44 #ifdef _WIN32
45 
46 	#ifdef _M_X64
47 		auto codeGen = new Jitter::CCodeGen_x86_64();
48 		codeGen->SetPlatformAbi(CCodeGen_x86_64::PLATFORM_ABI_WIN32);
49 		return codeGen;
50 	#else
51 		auto codeGen = new Jitter::CCodeGen_x86_32();
52 		codeGen->SetImplicitRetValueParamFixUpRequired(false);
53 		return codeGen;
54 	#endif
55 
56 #elif defined(__APPLE__)
57 
58 	#if TARGET_CPU_ARM
59 		auto codeGen = new Jitter::CCodeGen_AArch32();
60 		codeGen->SetPlatformAbi(CCodeGen_AArch32::PLATFORM_ABI_IOS);
61 		return codeGen;
62 	#elif TARGET_CPU_ARM64
63 		return new Jitter::CCodeGen_AArch64();
64 	#elif TARGET_CPU_X86
65 		auto codeGen = new Jitter::CCodeGen_x86_32();
66 		codeGen->SetImplicitRetValueParamFixUpRequired(true);
67 		return codeGen;
68 	#elif TARGET_CPU_X86_64
69 		auto codeGen = new Jitter::CCodeGen_x86_64();
70 		codeGen->SetPlatformAbi(CCodeGen_x86_64::PLATFORM_ABI_SYSTEMV);
71 		return codeGen;
72 	#else
73 		throw std::runtime_error("Unsupported architecture.");
74 	#endif
75 
76 #elif defined(__ANDROID__) || defined(__linux__) || defined(__FreeBSD__)
77 
78 	#if defined(__arm__)
79 		#if defined(__ARM_EABI__)
80 			auto codeGen = new Jitter::CCodeGen_AArch32();
81 			codeGen->SetPlatformAbi(CCodeGen_AArch32::PLATFORM_ABI_ARMEABI);
82 			return codeGen;
83 		#else
84 			throw std::runtime_error("Unsupported AArch32 ABI.");
85 		#endif
86 	#elif defined(__aarch64__)
87 		return new Jitter::CCodeGen_AArch64();
88 	#elif defined(__i386__)
89 		auto codeGen = new Jitter::CCodeGen_x86_32();
90 		codeGen->SetImplicitRetValueParamFixUpRequired(true);
91 		return codeGen;
92 	#elif defined(__x86_64__)
93 		auto codeGen = new Jitter::CCodeGen_x86_64();
94 		codeGen->SetPlatformAbi(CCodeGen_x86_64::PLATFORM_ABI_SYSTEMV);
95 		return codeGen;
96 	#else
97 		throw std::runtime_error("Unsupported architecture.");
98 	#endif
99 
100 #else
101 
102 	throw std::runtime_error("Unsupported platform.");
103 
104 #endif
105 }
106