LLVM: lib/DebugInfo/PDB/Native/DbiModuleList.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

16#include

17#include

18#include

19

20using namespace llvm;

22

25 : Modules(&Modules), Modi(Modi), Filei(Filei) {

26 setValue();

27}

28

31

32 if (!isCompatible(R))

33 return false;

34

35

36 if (isEnd() && R.isEnd())

37 return true;

38

39

40 if (isEnd() != R.isEnd())

41 return false;

42

43

44

45

46

47

48

49 assert(Modules == R.Modules);

50 assert(Modi == R.Modi);

53

54 return (Filei == R.Filei);

55}

56

59 assert(isCompatible(R));

60

61

62

63

64 if (*this == R)

65 return false;

66

67 return Filei < R.Filei;

68}

69

72 assert(isCompatible(R));

74

75

76 if (isEnd() && R.isEnd())

77 return 0;

78

80

81

82

83

84

86 if (isEnd()) {

88 Thisi = R.Modules->getSourceFileCount(RealModi);

89 }

90

91 assert(Thisi >= R.Filei);

92 return Thisi - R.Filei;

93}

94

98

99 Filei += N;

100 assert(Filei <= Modules->getSourceFileCount(Modi));

101 setValue();

102 return *this;

103}

104

107

108

109 assert(!isUniversalEnd());

110

112

113 Filei -= N;

114 return *this;

115}

116

117void DbiModuleSourceFilesIterator::setValue() {

118 if (isEnd()) {

119 ThisValue = "";

120 return;

121 }

122

123 uint32_t Off = Modules->ModuleInitialFileIndex[Modi] + Filei;

124 auto ExpectedValue = Modules->getFileName(Off);

125 if (!ExpectedValue) {

128 } else

129 ThisValue = *ExpectedValue;

130}

131

132bool DbiModuleSourceFilesIterator::isEnd() const {

133 if (isUniversalEnd())

134 return true;

135

137 assert(Modi <= Modules->getModuleCount());

138 assert(Filei <= Modules->getSourceFileCount(Modi));

139

140 if (Modi == Modules->getModuleCount())

141 return true;

142 if (Filei == Modules->getSourceFileCount(Modi))

143 return true;

144 return false;

145}

146

147bool DbiModuleSourceFilesIterator::isUniversalEnd() const { return !Modules; }

148

149bool DbiModuleSourceFilesIterator::isCompatible(

151

152 if (isUniversalEnd() || R.isUniversalEnd())

153 return true;

154

155

156

157

158

159 return Modi == R.Modi;

160}

161

164 if (auto EC = initializeModInfo(ModInfo))

165 return EC;

166 if (auto EC = initializeFileInfo(FileInfo))

167 return EC;

168

170}

171

173 ModInfoSubstream = ModInfo;

174

177

179

180 if (auto EC = Reader.readArray(Descriptors, ModInfo.getLength()))

181 return EC;

182

184}

185

187 FileInfoSubstream = FileInfo;

188

189 if (FileInfo.getLength() == 0)

191

193 if (auto EC = FISR.readObject(FileInfoHeader))

194 return EC;

195

196

197

199 if (auto EC = FISR.readArray(ModuleIndices, FileInfoHeader->NumModules))

200 return EC;

201 if (auto EC = FISR.readArray(ModFileCountArray, FileInfoHeader->NumModules))

202 return EC;

203

204

205

206

207

209 for (auto Count : ModFileCountArray)

210 NumSourceFiles += Count;

211

212

213

214

215

216 if (auto EC = FISR.readArray(FileNameOffsets, NumSourceFiles))

217 return EC;

218

219 if (auto EC = FISR.readStreamRef(NamesBuffer))

220 return EC;

221

222 auto DescriptorIter = Descriptors.begin();

224 ModuleInitialFileIndex.resize(FileInfoHeader->NumModules);

225 ModuleDescriptorOffsets.resize(FileInfoHeader->NumModules);

226 for (size_t I = 0; I < FileInfoHeader->NumModules; ++I) {

227 assert(DescriptorIter != Descriptors.end());

228 ModuleInitialFileIndex[I] = NextFileIndex;

229 ModuleDescriptorOffsets[I] = DescriptorIter.offset();

230

231 NextFileIndex += ModFileCountArray[I];

232 ++DescriptorIter;

233 }

234

235 assert(DescriptorIter == Descriptors.end());

236 assert(NextFileIndex == NumSourceFiles);

237

239}

240

242

243

244 return FileInfoHeader ? FileInfoHeader->NumModules : 0;

245}

246

248 return FileNameOffsets.size();

249}

250

252 return ModFileCountArray[Modi];

253}

254

258 auto Iter = Descriptors.at(Offset);

259 assert(Iter != Descriptors.end());

260 return *Iter;

261}

262

266 DbiModuleSourceFilesIterator(*this, Modi, 0),

267 DbiModuleSourceFilesIterator());

268}

269

274

275 uint32_t FileOffset = FileNameOffsets[Index];

279 return std::move(EC);

280 return Name;

281}

assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")

Provides read only access to a subclass of BinaryStream.

LLVM_ABI Error readCString(StringRef &Dest)

Read a null terminated string from Dest.

void setOffset(uint64_t Off)

uint64_t getLength() const

BinaryStreamRef is to BinaryStream what ArrayRef is to an Array.

Lightweight error class with error context and mandatory checking.

static ErrorSuccess success()

Create a success value.

Tagged union holding either a T or a Error.

FixedStreamArray is similar to VarStreamArray, except with each record having a fixed-length.

StringRef - Represent a constant reference to a string, i.e.

A range adaptor for a pair of iterators.

LLVM_ABI DbiModuleDescriptor getModuleDescriptor(uint32_t Modi) const

Definition DbiModuleList.cpp:255

LLVM_ABI uint32_t getModuleCount() const

Definition DbiModuleList.cpp:241

LLVM_ABI Error initialize(BinaryStreamRef ModInfo, BinaryStreamRef FileInfo)

Definition DbiModuleList.cpp:162

LLVM_ABI uint32_t getSourceFileCount() const

Definition DbiModuleList.cpp:247

LLVM_ABI iterator_range< DbiModuleSourceFilesIterator > source_files(uint32_t Modi) const

Definition DbiModuleList.cpp:264

LLVM_ABI Expected< StringRef > getFileName(uint32_t Index) const

Definition DbiModuleList.cpp:270

DbiModuleSourceFilesIterator()=default

LLVM_ABI DbiModuleSourceFilesIterator & operator-=(std::ptrdiff_t N)

Definition DbiModuleList.cpp:106

LLVM_ABI DbiModuleSourceFilesIterator(const DbiModuleList &Modules, uint32_t Modi, uint16_t Filei)

Definition DbiModuleList.cpp:23

LLVM_ABI std::ptrdiff_t operator-(const DbiModuleSourceFilesIterator &R) const

Definition DbiModuleList.cpp:71

LLVM_ABI bool operator==(const DbiModuleSourceFilesIterator &R) const

Definition DbiModuleList.cpp:30

LLVM_ABI DbiModuleSourceFilesIterator & operator+=(std::ptrdiff_t N)

Definition DbiModuleList.cpp:96

LLVM_ABI bool operator<(const DbiModuleSourceFilesIterator &RHS) const

Definition DbiModuleList.cpp:58

This provides a very simple, boring adaptor for a begin and end iterator into a range type.

This is an optimization pass for GlobalISel generic memory operations.

iterator_range< T > make_range(T x, T y)

Convenience function for iterating over sub-ranges.

FunctionAddr VTableAddr Count

Error make_error(ArgTs &&... Args)

Make a Error instance representing failure using the given error info type.

void consumeError(Error Err)

Consume a Error without doing anything.