diff options
Diffstat (limited to 'contrib/llvm/tools/llvmc/examples/mcc16/Hooks.cpp')
-rw-r--r-- | contrib/llvm/tools/llvmc/examples/mcc16/Hooks.cpp | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/contrib/llvm/tools/llvmc/examples/mcc16/Hooks.cpp b/contrib/llvm/tools/llvmc/examples/mcc16/Hooks.cpp new file mode 100644 index 0000000..edb91e1 --- /dev/null +++ b/contrib/llvm/tools/llvmc/examples/mcc16/Hooks.cpp @@ -0,0 +1,109 @@ +#include "llvm/System/Path.h" +#include "llvm/Support/CommandLine.h" +#include "llvm/Support/raw_ostream.h" + +#include <string> + +namespace llvmc { + extern char *ProgramName; + + namespace autogenerated { + extern llvm::cl::opt<std::string> Parameter_p; + } +} + +using namespace llvm; +using namespace llvmc; + +// Returns the platform specific directory separator via #ifdefs. +// FIXME: This currently work on linux and windows only. It does not +// work on other unices. +static std::string GetDirSeparator() { +#if __linux__ || __APPLE__ + return "/"; +#else + return "\\"; +#endif +} + +namespace hooks { +// Get preprocessor define for the part. +// It is __partname format in lower case. +std::string +GetLowerCasePartDefine(void) { + std::string Partname; + if (autogenerated::Parameter_p.empty()) { + Partname = "16f1xxx"; + } else { + Partname = autogenerated::Parameter_p; + } + + std::string LowerCase; + for (unsigned i = 0; i < Partname.size(); i++) { + LowerCase.push_back(std::tolower(Partname[i])); + } + + return "__" + LowerCase; +} + +std::string +GetUpperCasePartDefine(void) { + std::string Partname; + if (autogenerated::Parameter_p.empty()) { + Partname = "16f1xxx"; + } else { + Partname = autogenerated::Parameter_p; + } + + std::string UpperCase; + for (unsigned i = 0; i < Partname.size(); i++) { + UpperCase.push_back(std::toupper(Partname[i])); + } + + return "__" + UpperCase; +} + +// Get the dir where c16 executables reside. +std::string GetBinDir() { + // Construct a Path object from the program name. + void *P = (void*) (intptr_t) GetBinDir; + sys::Path ProgramFullPath + = sys::Path::GetMainExecutable(llvmc::ProgramName, P); + + // Get the dir name for the program. It's last component should be 'bin'. + std::string BinDir = ProgramFullPath.getDirname(); + + // llvm::errs() << "BinDir: " << BinDir << '\n'; + return BinDir + GetDirSeparator(); +} + +// Get the Top-level Installation dir for c16. +std::string GetInstallDir() { + sys::Path BinDirPath = sys::Path(GetBinDir()); + + // Go one more level up to get the install dir. + std::string InstallDir = BinDirPath.getDirname(); + + return InstallDir + GetDirSeparator(); +} + +// Get the dir where the c16 header files reside. +std::string GetStdHeadersDir() { + return GetInstallDir() + "include"; +} + +// Get the dir where the assembler header files reside. +std::string GetStdAsmHeadersDir() { + return GetInstallDir() + "inc"; +} + +// Get the dir where the linker scripts reside. +std::string GetStdLinkerScriptsDir() { + return GetInstallDir() + "lkr"; +} + +// Get the dir where startup code, intrinsics and lib reside. +std::string GetStdLibsDir() { + return GetInstallDir() + "lib"; +} +} |