diff options
Diffstat (limited to 'src/trans/target.cpp')
-rw-r--r-- | src/trans/target.cpp | 67 |
1 files changed, 54 insertions, 13 deletions
diff --git a/src/trans/target.cpp b/src/trans/target.cpp index d9b3486e..43b63822 100644 --- a/src/trans/target.cpp +++ b/src/trans/target.cpp @@ -8,24 +8,65 @@ #include "target.hpp" #include <algorithm> #include "../expand/cfg.hpp" +#include <fstream> -// TODO: Replace with target selection -#define POINTER_SIZE_BYTES 8 +TargetArch ARCH_X86_64 = { + "x86_64", + 64, false, + { true, false, true, true, true } + }; +TargetSpec g_target; -TargetSpec g_target = { - "unix", - "linux", - "gnu", - CodegenMode::Gnu11, - TargetArch { - "x86_64", - 64, false, - { true, false, true, true, true } +namespace +{ + TargetSpec load_spec_from_file(const ::std::string& filename) + { + throw ""; + } + TargetSpec init_from_spec_name(const ::std::string& target_name) + { + if( ::std::ifstream(target_name).is_open() ) + { + return load_spec_from_file(target_name); } - }; + else if(target_name == "x86_64-linux-gnu") + { + return TargetSpec { + "unix", "linux", "gnu", CodegenMode::Gnu11, + ARCH_X86_64 + }; + } + else if(target_name == "x86_64-windows-gnu") + { + return TargetSpec { + "windows", "windows", "gnu", CodegenMode::Gnu11, + ARCH_X86_64 + }; + } + else if (target_name == "x86_64-windows-msvc") + { + return TargetSpec { + "windows", "windows", "msvd", CodegenMode::Msvc, + ARCH_X86_64 + }; + } + else + { + ::std::cerr << "Unknown target name '" << target_name << "'" << ::std::endl; + abort(); + } + throw ""; + } +} -void Target_SetCfg() +const TargetSpec& Target_GetCurSpec() { + return g_target; +} +void Target_SetCfg(const ::std::string& target_name) +{ + g_target = init_from_spec_name(target_name); + if(g_target.m_family == "unix") { Cfg_SetFlag("unix"); } |