brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.6 KiB · 2f638ee Raw
153 lines · cpp
1//===- BuildSystem.cpp - Utilities for use by build systems ---------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This file implements various utilities for use by build systems.10//11//===----------------------------------------------------------------------===//12 13#include "clang-c/BuildSystem.h"14#include "CXString.h"15#include "llvm/ADT/SmallString.h"16#include "llvm/Support/CBindingWrapping.h"17#include "llvm/Support/Chrono.h"18#include "llvm/Support/ErrorHandling.h"19#include "llvm/Support/MemAlloc.h"20#include "llvm/Support/Path.h"21#include "llvm/Support/VirtualFileSystem.h"22#include "llvm/Support/raw_ostream.h"23 24using namespace clang;25using namespace llvm::sys;26 27unsigned long long clang_getBuildSessionTimestamp(void) {28  return llvm::sys::toTimeT(std::chrono::system_clock::now());29}30 31DEFINE_SIMPLE_CONVERSION_FUNCTIONS(llvm::vfs::YAMLVFSWriter,32                                   CXVirtualFileOverlay)33 34CXVirtualFileOverlay clang_VirtualFileOverlay_create(unsigned) {35  return wrap(new llvm::vfs::YAMLVFSWriter());36}37 38enum CXErrorCode39clang_VirtualFileOverlay_addFileMapping(CXVirtualFileOverlay VFO,40                                        const char *virtualPath,41                                        const char *realPath) {42  if (!VFO || !virtualPath || !realPath)43    return CXError_InvalidArguments;44  if (!path::is_absolute(virtualPath))45    return CXError_InvalidArguments;46  if (!path::is_absolute(realPath))47    return CXError_InvalidArguments;48 49  for (path::const_iterator50         PI = path::begin(virtualPath),51         PE = path::end(virtualPath); PI != PE; ++PI) {52    StringRef Comp = *PI;53    if (Comp == "." || Comp == "..")54      return CXError_InvalidArguments;55  }56 57  unwrap(VFO)->addFileMapping(virtualPath, realPath);58  return CXError_Success;59}60 61enum CXErrorCode62clang_VirtualFileOverlay_setCaseSensitivity(CXVirtualFileOverlay VFO,63                                            int caseSensitive) {64  if (!VFO)65    return CXError_InvalidArguments;66  unwrap(VFO)->setCaseSensitivity(caseSensitive);67  return CXError_Success;68}69 70enum CXErrorCode71clang_VirtualFileOverlay_writeToBuffer(CXVirtualFileOverlay VFO, unsigned,72                                       char **out_buffer_ptr,73                                       unsigned *out_buffer_size) {74  if (!VFO || !out_buffer_ptr || !out_buffer_size)75    return CXError_InvalidArguments;76 77  llvm::SmallString<256> Buf;78  llvm::raw_svector_ostream OS(Buf);79  unwrap(VFO)->write(OS);80 81  StringRef Data = OS.str();82  *out_buffer_ptr = static_cast<char*>(llvm::safe_malloc(Data.size()));83  *out_buffer_size = Data.size();84  memcpy(*out_buffer_ptr, Data.data(), Data.size());85  return CXError_Success;86}87 88void clang_free(void *buffer) {89  free(buffer);90}91 92void clang_VirtualFileOverlay_dispose(CXVirtualFileOverlay VFO) {93  delete unwrap(VFO);94}95 96 97struct CXModuleMapDescriptorImpl {98  std::string ModuleName;99  std::string UmbrellaHeader;100};101 102CXModuleMapDescriptor clang_ModuleMapDescriptor_create(unsigned) {103  return new CXModuleMapDescriptorImpl();104}105 106enum CXErrorCode107clang_ModuleMapDescriptor_setFrameworkModuleName(CXModuleMapDescriptor MMD,108                                                 const char *name) {109  if (!MMD || !name)110    return CXError_InvalidArguments;111 112  MMD->ModuleName = name;113  return CXError_Success;114}115 116enum CXErrorCode117clang_ModuleMapDescriptor_setUmbrellaHeader(CXModuleMapDescriptor MMD,118                                            const char *name) {119  if (!MMD || !name)120    return CXError_InvalidArguments;121 122  MMD->UmbrellaHeader = name;123  return CXError_Success;124}125 126enum CXErrorCode127clang_ModuleMapDescriptor_writeToBuffer(CXModuleMapDescriptor MMD, unsigned,128                                       char **out_buffer_ptr,129                                       unsigned *out_buffer_size) {130  if (!MMD || !out_buffer_ptr || !out_buffer_size)131    return CXError_InvalidArguments;132 133  llvm::SmallString<256> Buf;134  llvm::raw_svector_ostream OS(Buf);135  OS << "framework module " << MMD->ModuleName << " {\n";136  OS << "  umbrella header \"";137  OS.write_escaped(MMD->UmbrellaHeader) << "\"\n";138  OS << '\n';139  OS << "  export *\n";140  OS << "  module * { export * }\n";141  OS << "}\n";142 143  StringRef Data = OS.str();144  *out_buffer_ptr = static_cast<char*>(llvm::safe_malloc(Data.size()));145  *out_buffer_size = Data.size();146  memcpy(*out_buffer_ptr, Data.data(), Data.size());147  return CXError_Success;148}149 150void clang_ModuleMapDescriptor_dispose(CXModuleMapDescriptor MMD) {151  delete MMD;152}153