xref: /aosp_15_r20/external/clang/tools/libclang/BuildSystem.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===- BuildSystem.cpp - Utilities for use by build systems ---------------===//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li //
10*67e74705SXin Li // This file implements various utilities for use by build systems.
11*67e74705SXin Li //
12*67e74705SXin Li //===----------------------------------------------------------------------===//
13*67e74705SXin Li 
14*67e74705SXin Li #include "clang-c/BuildSystem.h"
15*67e74705SXin Li #include "CXString.h"
16*67e74705SXin Li #include "clang/Basic/VirtualFileSystem.h"
17*67e74705SXin Li #include "llvm/ADT/SmallString.h"
18*67e74705SXin Li #include "llvm/Support/CBindingWrapping.h"
19*67e74705SXin Li #include "llvm/Support/Path.h"
20*67e74705SXin Li #include "llvm/Support/TimeValue.h"
21*67e74705SXin Li #include "llvm/Support/raw_ostream.h"
22*67e74705SXin Li 
23*67e74705SXin Li using namespace clang;
24*67e74705SXin Li using namespace llvm::sys;
25*67e74705SXin Li 
clang_getBuildSessionTimestamp(void)26*67e74705SXin Li unsigned long long clang_getBuildSessionTimestamp(void) {
27*67e74705SXin Li   return llvm::sys::TimeValue::now().toEpochTime();
28*67e74705SXin Li }
29*67e74705SXin Li 
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(clang::vfs::YAMLVFSWriter,CXVirtualFileOverlay)30*67e74705SXin Li DEFINE_SIMPLE_CONVERSION_FUNCTIONS(clang::vfs::YAMLVFSWriter,
31*67e74705SXin Li                                    CXVirtualFileOverlay)
32*67e74705SXin Li 
33*67e74705SXin Li CXVirtualFileOverlay clang_VirtualFileOverlay_create(unsigned) {
34*67e74705SXin Li   return wrap(new clang::vfs::YAMLVFSWriter());
35*67e74705SXin Li }
36*67e74705SXin Li 
37*67e74705SXin Li enum CXErrorCode
clang_VirtualFileOverlay_addFileMapping(CXVirtualFileOverlay VFO,const char * virtualPath,const char * realPath)38*67e74705SXin Li clang_VirtualFileOverlay_addFileMapping(CXVirtualFileOverlay VFO,
39*67e74705SXin Li                                         const char *virtualPath,
40*67e74705SXin Li                                         const char *realPath) {
41*67e74705SXin Li   if (!VFO || !virtualPath || !realPath)
42*67e74705SXin Li     return CXError_InvalidArguments;
43*67e74705SXin Li   if (!path::is_absolute(virtualPath))
44*67e74705SXin Li     return CXError_InvalidArguments;
45*67e74705SXin Li   if (!path::is_absolute(realPath))
46*67e74705SXin Li     return CXError_InvalidArguments;
47*67e74705SXin Li 
48*67e74705SXin Li   for (path::const_iterator
49*67e74705SXin Li          PI = path::begin(virtualPath),
50*67e74705SXin Li          PE = path::end(virtualPath); PI != PE; ++PI) {
51*67e74705SXin Li     StringRef Comp = *PI;
52*67e74705SXin Li     if (Comp == "." || Comp == "..")
53*67e74705SXin Li       return CXError_InvalidArguments;
54*67e74705SXin Li   }
55*67e74705SXin Li 
56*67e74705SXin Li   unwrap(VFO)->addFileMapping(virtualPath, realPath);
57*67e74705SXin Li   return CXError_Success;
58*67e74705SXin Li }
59*67e74705SXin Li 
60*67e74705SXin Li enum CXErrorCode
clang_VirtualFileOverlay_setCaseSensitivity(CXVirtualFileOverlay VFO,int caseSensitive)61*67e74705SXin Li clang_VirtualFileOverlay_setCaseSensitivity(CXVirtualFileOverlay VFO,
62*67e74705SXin Li                                             int caseSensitive) {
63*67e74705SXin Li   if (!VFO)
64*67e74705SXin Li     return CXError_InvalidArguments;
65*67e74705SXin Li   unwrap(VFO)->setCaseSensitivity(caseSensitive);
66*67e74705SXin Li   return CXError_Success;
67*67e74705SXin Li }
68*67e74705SXin Li 
69*67e74705SXin Li enum CXErrorCode
clang_VirtualFileOverlay_writeToBuffer(CXVirtualFileOverlay VFO,unsigned,char ** out_buffer_ptr,unsigned * out_buffer_size)70*67e74705SXin Li clang_VirtualFileOverlay_writeToBuffer(CXVirtualFileOverlay VFO, unsigned,
71*67e74705SXin Li                                        char **out_buffer_ptr,
72*67e74705SXin Li                                        unsigned *out_buffer_size) {
73*67e74705SXin Li   if (!VFO || !out_buffer_ptr || !out_buffer_size)
74*67e74705SXin Li     return CXError_InvalidArguments;
75*67e74705SXin Li 
76*67e74705SXin Li   llvm::SmallString<256> Buf;
77*67e74705SXin Li   llvm::raw_svector_ostream OS(Buf);
78*67e74705SXin Li   unwrap(VFO)->write(OS);
79*67e74705SXin Li 
80*67e74705SXin Li   StringRef Data = OS.str();
81*67e74705SXin Li   *out_buffer_ptr = (char*)malloc(Data.size());
82*67e74705SXin Li   *out_buffer_size = Data.size();
83*67e74705SXin Li   memcpy(*out_buffer_ptr, Data.data(), Data.size());
84*67e74705SXin Li   return CXError_Success;
85*67e74705SXin Li }
86*67e74705SXin Li 
clang_free(void * buffer)87*67e74705SXin Li void clang_free(void *buffer) {
88*67e74705SXin Li   free(buffer);
89*67e74705SXin Li }
90*67e74705SXin Li 
clang_VirtualFileOverlay_dispose(CXVirtualFileOverlay VFO)91*67e74705SXin Li void clang_VirtualFileOverlay_dispose(CXVirtualFileOverlay VFO) {
92*67e74705SXin Li   delete unwrap(VFO);
93*67e74705SXin Li }
94*67e74705SXin Li 
95*67e74705SXin Li 
96*67e74705SXin Li struct CXModuleMapDescriptorImpl {
97*67e74705SXin Li   std::string ModuleName;
98*67e74705SXin Li   std::string UmbrellaHeader;
99*67e74705SXin Li };
100*67e74705SXin Li 
clang_ModuleMapDescriptor_create(unsigned)101*67e74705SXin Li CXModuleMapDescriptor clang_ModuleMapDescriptor_create(unsigned) {
102*67e74705SXin Li   return new CXModuleMapDescriptorImpl();
103*67e74705SXin Li }
104*67e74705SXin Li 
105*67e74705SXin Li enum CXErrorCode
clang_ModuleMapDescriptor_setFrameworkModuleName(CXModuleMapDescriptor MMD,const char * name)106*67e74705SXin Li clang_ModuleMapDescriptor_setFrameworkModuleName(CXModuleMapDescriptor MMD,
107*67e74705SXin Li                                                  const char *name) {
108*67e74705SXin Li   if (!MMD || !name)
109*67e74705SXin Li     return CXError_InvalidArguments;
110*67e74705SXin Li 
111*67e74705SXin Li   MMD->ModuleName = name;
112*67e74705SXin Li   return CXError_Success;
113*67e74705SXin Li }
114*67e74705SXin Li 
115*67e74705SXin Li enum CXErrorCode
clang_ModuleMapDescriptor_setUmbrellaHeader(CXModuleMapDescriptor MMD,const char * name)116*67e74705SXin Li clang_ModuleMapDescriptor_setUmbrellaHeader(CXModuleMapDescriptor MMD,
117*67e74705SXin Li                                             const char *name) {
118*67e74705SXin Li   if (!MMD || !name)
119*67e74705SXin Li     return CXError_InvalidArguments;
120*67e74705SXin Li 
121*67e74705SXin Li   MMD->UmbrellaHeader = name;
122*67e74705SXin Li   return CXError_Success;
123*67e74705SXin Li }
124*67e74705SXin Li 
125*67e74705SXin Li enum CXErrorCode
clang_ModuleMapDescriptor_writeToBuffer(CXModuleMapDescriptor MMD,unsigned,char ** out_buffer_ptr,unsigned * out_buffer_size)126*67e74705SXin Li clang_ModuleMapDescriptor_writeToBuffer(CXModuleMapDescriptor MMD, unsigned,
127*67e74705SXin Li                                        char **out_buffer_ptr,
128*67e74705SXin Li                                        unsigned *out_buffer_size) {
129*67e74705SXin Li   if (!MMD || !out_buffer_ptr || !out_buffer_size)
130*67e74705SXin Li     return CXError_InvalidArguments;
131*67e74705SXin Li 
132*67e74705SXin Li   llvm::SmallString<256> Buf;
133*67e74705SXin Li   llvm::raw_svector_ostream OS(Buf);
134*67e74705SXin Li   OS << "framework module " << MMD->ModuleName << " {\n";
135*67e74705SXin Li   OS << "  umbrella header \"";
136*67e74705SXin Li   OS.write_escaped(MMD->UmbrellaHeader) << "\"\n";
137*67e74705SXin Li   OS << '\n';
138*67e74705SXin Li   OS << "  export *\n";
139*67e74705SXin Li   OS << "  module * { export * }\n";
140*67e74705SXin Li   OS << "}\n";
141*67e74705SXin Li 
142*67e74705SXin Li   StringRef Data = OS.str();
143*67e74705SXin Li   *out_buffer_ptr = (char*)malloc(Data.size());
144*67e74705SXin Li   *out_buffer_size = Data.size();
145*67e74705SXin Li   memcpy(*out_buffer_ptr, Data.data(), Data.size());
146*67e74705SXin Li   return CXError_Success;
147*67e74705SXin Li }
148*67e74705SXin Li 
clang_ModuleMapDescriptor_dispose(CXModuleMapDescriptor MMD)149*67e74705SXin Li void clang_ModuleMapDescriptor_dispose(CXModuleMapDescriptor MMD) {
150*67e74705SXin Li   delete MMD;
151*67e74705SXin Li }
152