mirror of
https://github.com/llvm/llvm-project.git
synced 2025-05-09 22:46:05 +00:00

with a particular system root directory and can be used with a different system root directory when the headers it depends on have been installed. Relocatable precompiled headers rewrite the file names of the headers used when generating the PCH file into the corresponding file names of the headers available when using the PCH file. Addresses <rdar://problem/7001604>. llvm-svn: 74885
85 lines
2.6 KiB
C++
85 lines
2.6 KiB
C++
//===--- GeneratePCH.cpp - AST Consumer for PCH Generation ------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file defines the CreatePCHGenerate function, which creates an
|
|
// ASTConsume that generates a PCH file.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "clang/Frontend/ASTConsumers.h"
|
|
#include "clang/Frontend/PCHWriter.h"
|
|
#include "clang/Sema/SemaConsumer.h"
|
|
#include "clang/AST/ASTContext.h"
|
|
#include "clang/AST/ASTConsumer.h"
|
|
#include "clang/Lex/Preprocessor.h"
|
|
#include "clang/Basic/FileManager.h"
|
|
#include "llvm/Bitcode/BitstreamWriter.h"
|
|
#include "llvm/System/Path.h"
|
|
#include "llvm/Support/Compiler.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
#include "llvm/Support/Streams.h"
|
|
#include <string>
|
|
|
|
using namespace clang;
|
|
using namespace llvm;
|
|
|
|
namespace {
|
|
class VISIBILITY_HIDDEN PCHGenerator : public SemaConsumer {
|
|
const Preprocessor &PP;
|
|
const char *isysroot;
|
|
llvm::raw_ostream *Out;
|
|
Sema *SemaPtr;
|
|
MemorizeStatCalls *StatCalls; // owned by the FileManager
|
|
|
|
public:
|
|
explicit PCHGenerator(const Preprocessor &PP,
|
|
const char *isysroot,
|
|
llvm::raw_ostream *Out);
|
|
virtual void InitializeSema(Sema &S) { SemaPtr = &S; }
|
|
virtual void HandleTranslationUnit(ASTContext &Ctx);
|
|
};
|
|
}
|
|
|
|
PCHGenerator::PCHGenerator(const Preprocessor &PP,
|
|
const char *isysroot,
|
|
llvm::raw_ostream *OS)
|
|
: PP(PP), isysroot(isysroot), Out(OS), SemaPtr(0), StatCalls(0) {
|
|
|
|
// Install a stat() listener to keep track of all of the stat()
|
|
// calls.
|
|
StatCalls = new MemorizeStatCalls;
|
|
PP.getFileManager().setStatCache(StatCalls);
|
|
}
|
|
|
|
void PCHGenerator::HandleTranslationUnit(ASTContext &Ctx) {
|
|
if (PP.getDiagnostics().hasErrorOccurred())
|
|
return;
|
|
|
|
// Write the PCH contents into a buffer
|
|
std::vector<unsigned char> Buffer;
|
|
BitstreamWriter Stream(Buffer);
|
|
PCHWriter Writer(Stream);
|
|
|
|
// Emit the PCH file
|
|
assert(SemaPtr && "No Sema?");
|
|
Writer.WritePCH(*SemaPtr, StatCalls, isysroot);
|
|
|
|
// Write the generated bitstream to "Out".
|
|
Out->write((char *)&Buffer.front(), Buffer.size());
|
|
|
|
// Make sure it hits disk now.
|
|
Out->flush();
|
|
}
|
|
|
|
ASTConsumer *clang::CreatePCHGenerator(const Preprocessor &PP,
|
|
llvm::raw_ostream *OS,
|
|
const char *isysroot) {
|
|
return new PCHGenerator(PP, isysroot, OS);
|
|
}
|