diff options
Diffstat (limited to 'tools/libclang/BuildSystem.cpp')
-rw-r--r-- | tools/libclang/BuildSystem.cpp | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/tools/libclang/BuildSystem.cpp b/tools/libclang/BuildSystem.cpp new file mode 100644 index 000000000000..e9423c328698 --- /dev/null +++ b/tools/libclang/BuildSystem.cpp @@ -0,0 +1,147 @@ +//===- BuildSystem.cpp - Utilities for use by build systems ---------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file implements various utilities for use by build systems. +// +//===----------------------------------------------------------------------===// + +#include "clang-c/BuildSystem.h" +#include "CXString.h" +#include "clang/Basic/VirtualFileSystem.h" +#include "llvm/ADT/SmallString.h" +#include "llvm/Support/CBindingWrapping.h" +#include "llvm/Support/Path.h" +#include "llvm/Support/TimeValue.h" +#include "llvm/Support/raw_ostream.h" + +using namespace clang; +using namespace llvm::sys; + +unsigned long long clang_getBuildSessionTimestamp(void) { + return llvm::sys::TimeValue::now().toEpochTime(); +} + +DEFINE_SIMPLE_CONVERSION_FUNCTIONS(clang::vfs::YAMLVFSWriter, + CXVirtualFileOverlay) + +CXVirtualFileOverlay clang_VirtualFileOverlay_create(unsigned) { + return wrap(new clang::vfs::YAMLVFSWriter()); +} + +enum CXErrorCode +clang_VirtualFileOverlay_addFileMapping(CXVirtualFileOverlay VFO, + const char *virtualPath, + const char *realPath) { + if (!VFO || !virtualPath || !realPath) + return CXError_InvalidArguments; + if (!path::is_absolute(virtualPath)) + return CXError_InvalidArguments; + if (!path::is_absolute(realPath)) + return CXError_InvalidArguments; + + for (path::const_iterator + PI = path::begin(virtualPath), + PE = path::end(virtualPath); PI != PE; ++PI) { + StringRef Comp = *PI; + if (Comp == "." || Comp == "..") + return CXError_InvalidArguments; + } + + unwrap(VFO)->addFileMapping(virtualPath, realPath); + return CXError_Success; +} + +enum CXErrorCode +clang_VirtualFileOverlay_setCaseSensitivity(CXVirtualFileOverlay VFO, + int caseSensitive) { + if (!VFO) + return CXError_InvalidArguments; + unwrap(VFO)->setCaseSensitivity(caseSensitive); + return CXError_Success; +} + +enum CXErrorCode +clang_VirtualFileOverlay_writeToBuffer(CXVirtualFileOverlay VFO, unsigned, + char **out_buffer_ptr, + unsigned *out_buffer_size) { + if (!VFO || !out_buffer_ptr || !out_buffer_size) + return CXError_InvalidArguments; + + llvm::SmallString<256> Buf; + llvm::raw_svector_ostream OS(Buf); + unwrap(VFO)->write(OS); + + StringRef Data = OS.str(); + *out_buffer_ptr = (char*)malloc(Data.size()); + *out_buffer_size = Data.size(); + memcpy(*out_buffer_ptr, Data.data(), Data.size()); + return CXError_Success; +} + +void clang_VirtualFileOverlay_dispose(CXVirtualFileOverlay VFO) { + delete unwrap(VFO); +} + + +struct CXModuleMapDescriptorImpl { + std::string ModuleName; + std::string UmbrellaHeader; +}; + +CXModuleMapDescriptor clang_ModuleMapDescriptor_create(unsigned) { + return new CXModuleMapDescriptorImpl(); +} + +enum CXErrorCode +clang_ModuleMapDescriptor_setFrameworkModuleName(CXModuleMapDescriptor MMD, + const char *name) { + if (!MMD || !name) + return CXError_InvalidArguments; + + MMD->ModuleName = name; + return CXError_Success; +} + +enum CXErrorCode +clang_ModuleMapDescriptor_setUmbrellaHeader(CXModuleMapDescriptor MMD, + const char *name) { + if (!MMD || !name) + return CXError_InvalidArguments; + + MMD->UmbrellaHeader = name; + return CXError_Success; +} + +enum CXErrorCode +clang_ModuleMapDescriptor_writeToBuffer(CXModuleMapDescriptor MMD, unsigned, + char **out_buffer_ptr, + unsigned *out_buffer_size) { + if (!MMD || !out_buffer_ptr || !out_buffer_size) + return CXError_InvalidArguments; + + llvm::SmallString<256> Buf; + llvm::raw_svector_ostream OS(Buf); + OS << "framework module " << MMD->ModuleName << " {\n"; + OS << " umbrella header \""; + OS.write_escaped(MMD->UmbrellaHeader) << "\"\n"; + OS << '\n'; + OS << " export *\n"; + OS << " module * { export * }\n"; + OS << "}\n"; + + StringRef Data = OS.str(); + *out_buffer_ptr = (char*)malloc(Data.size()); + *out_buffer_size = Data.size(); + memcpy(*out_buffer_ptr, Data.data(), Data.size()); + return CXError_Success; +} + +void clang_ModuleMapDescriptor_dispose(CXModuleMapDescriptor MMD) { + delete MMD; +} |