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