xref: /llvm-project/clang/lib/InstallAPI/Frontend.cpp (revision c6cbf81c84b00ab0107a09f5b2d0183458a367b8)
1 //===- Frontend.cpp ---------------------------------------------*- C++ -*-===//
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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "clang/InstallAPI/Frontend.h"
10 #include "clang/AST/Availability.h"
11 #include "llvm/ADT/SmallString.h"
12 #include "llvm/ADT/StringRef.h"
13 
14 using namespace llvm;
15 using namespace llvm::MachO;
16 
17 namespace clang::installapi {
18 
19 static StringRef getFileExtension(clang::Language Lang) {
20   switch (Lang) {
21   default:
22     llvm_unreachable("Unexpected language option.");
23   case clang::Language::C:
24     return ".c";
25   case clang::Language::CXX:
26     return ".cpp";
27   case clang::Language::ObjC:
28     return ".m";
29   case clang::Language::ObjCXX:
30     return ".mm";
31   }
32 }
33 
34 std::unique_ptr<MemoryBuffer> createInputBuffer(const InstallAPIContext &Ctx) {
35   assert(Ctx.Type != HeaderType::Unknown &&
36          "unexpected access level for parsing");
37   SmallString<4096> Contents;
38   raw_svector_ostream OS(Contents);
39   for (const HeaderFile &H : Ctx.InputHeaders) {
40     if (H.getType() != Ctx.Type)
41       continue;
42     if (Ctx.LangMode == Language::C || Ctx.LangMode == Language::CXX)
43       OS << "#include ";
44     else
45       OS << "#import ";
46     if (H.useIncludeName())
47       OS << "<" << H.getIncludeName() << ">";
48     else
49       OS << "\"" << H.getPath() << "\"";
50   }
51   if (Contents.empty())
52     return nullptr;
53 
54   return llvm::MemoryBuffer::getMemBufferCopy(
55       Contents, "installapi-includes" + getFileExtension(Ctx.LangMode));
56 }
57 
58 } // namespace clang::installapi
59