clang: lib/StaticAnalyzer/Frontend/ModelInjector.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

21#include "llvm/ADT/STLExtras.h"

22#include "llvm/Support/CrashRecoveryContext.h"

23#include "llvm/Support/FileSystem.h"

24#include

25

26using namespace clang;

27using namespace ento;

28

30

32 onBodySynthesis(D);

33 return Bodies[D->getName()];

34}

35

37 onBodySynthesis(D);

38 return Bodies[D->getName()];

39}

40

41void ModelInjector::onBodySynthesis(const NamedDecl *D) {

42

43

44

45 if (Bodies.count(D->getName()) != 0)

46 return;

47

49 FileID mainFileID = SM.getMainFileID();

50

51 llvm::StringRef modelPath = CI.getAnalyzerOpts().ModelPath;

52

54

55 if (!modelPath.empty())

56 fileName =

57 llvm::StringRef(modelPath.str() + "/" + D->getName().str() + ".model");

58 else

59 fileName = llvm::StringRef(D->getName().str() + ".model");

60

61 if (!llvm::sys::fs::exists(fileName.str())) {

62 Bodies[D->getName()] = nullptr;

63 return;

64 }

65

66 auto Invocation = std::make_shared(CI.getInvocation());

67

68 FrontendOptions &FrontendOpts = Invocation->getFrontendOpts();

70 FrontendOpts.Inputs.clear();

71 FrontendOpts.Inputs.emplace_back(fileName, IK);

73

74 Invocation->getDiagnosticOpts().VerifyDiagnostics = 0;

75

76

77

79 Instance.setInvocation(std::move(Invocation));

80 Instance.createDiagnostics(

83 true);

84

85 Instance.getDiagnostics().setSourceManager(&SM);

86

87

88

90 Instance.setSourceManager(&SM);

93

94 Instance.getPreprocessor().InitializeForModelFile();

95

97

98 llvm::CrashRecoveryContext CRC;

99

100 CRC.RunSafelyOnThread([&]() { Instance.ExecuteAction(parseModelFile); },

102

103 Instance.getPreprocessor().FinalizeForModelFile();

104

105 Instance.resetAndLeakSourceManager();

106 Instance.resetAndLeakFileManager();

107 Instance.resetAndLeakPreprocessor();

108

109

110

111

112

113 SM.setMainFileID(mainFileID);

114}

Defines the clang::FrontendAction interface and various convenience abstract classes (clang::ASTFront...

Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.

This file defines the clang::ento::ModelInjector class which implements the clang::CodeInjector inter...

Defines the clang::Preprocessor interface.

Defines utilities for dealing with stack allocation and stack space.

CompilerInstance - Helper class for managing a single instance of the Clang compiler.

DiagnosticConsumer & getDiagnosticClient() const

AnalyzerOptions & getAnalyzerOpts()

std::shared_ptr< Preprocessor > getPreprocessorPtr()

FileManager & getFileManager() const

Return the current file manager to the caller.

ASTContext & getASTContext() const

CompilerInvocation & getInvocation()

llvm::vfs::FileSystem & getVirtualFileSystem() const

std::shared_ptr< PCHContainerOperations > getPCHContainerOperations() const

SourceManager & getSourceManager() const

Return the current source manager.

An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...

Diagnostic consumer that forwards diagnostics along to an existing, already-initialized diagnostic co...

FrontendOptions - Options for controlling the behavior of the frontend.

unsigned DisableFree

Disable memory freeing on exit.

SmallVector< FrontendInputFile, 0 > Inputs

The input files and their types.

Represents a function declaration or definition.

The kind of a file that we've been handed as an input.

This represents a decl that may have a name.

ObjCMethodDecl - Represents an instance or class method declaration.

This class handles loading and caching of source files into memory.

Stmt - This represents one statement.

Stmt * getBody(const FunctionDecl *D) override

ModelInjector(CompilerInstance &CI)

Frontend action to parse model files.

The JSON file list parser is used to communicate input to InstallAPI.

constexpr size_t DesiredStackSize

The amount of stack space that Clang would like to be provided with.