COFF.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. #pragma once
  2. #include "DbgModule.h"
  3. #include "StrBloomMap.h"
  4. #include "DbgSymSrv.h"
  5. #include "Compiler/BfUtil.h"
  6. #include "Backend/BeLibManger.h"
  7. namespace Beefy
  8. {
  9. class FileStream;
  10. class DataStream;
  11. class MemStream;
  12. class SafeMemStream;
  13. class ZipFile;
  14. }
  15. struct CV_LVAR_ADDR_RANGE;
  16. struct CV_LVAR_ADDR_GAP;
  17. NS_BF_DBG_BEGIN
  18. struct CvSectionContrib
  19. {
  20. int16 mSection;
  21. int16 mPad1;
  22. int32 mOffset;
  23. int32 mSize;
  24. uint32 mFlags;
  25. int16 mModule;
  26. int16 mPad2;
  27. uint32 mDataCrc;
  28. uint32 mRelocCrc;
  29. };
  30. struct CvModuleInfoBase
  31. {
  32. uint32 mOpened;
  33. CvSectionContrib mSectionContrib;
  34. uint16 mFlags;
  35. int16 mStream;
  36. int32 mSymbolBytes;
  37. int32 mOldLinesBytes;
  38. int32 mLinesBytes;
  39. int16 mNumFiles;
  40. uint16 mPadding;
  41. uint32 mOffsets;
  42. int32 mSourceFileCount;
  43. int32 mCompilerNameCount;
  44. };
  45. class CvCompileUnit;
  46. struct CvCrossScopeImport
  47. {
  48. const char* mScopeName;
  49. CvCompileUnit* mScopeCompileUnit;
  50. Array<uint32> mImports;
  51. };
  52. struct CvCrossScopeExportEntry
  53. {
  54. uint32 mLocalId;
  55. uint32 mGlobalId;
  56. };
  57. class CvCompileUnit : public DbgCompileUnit
  58. {
  59. public:
  60. Array<CvCrossScopeExportEntry> mExports;
  61. Array<CvCrossScopeImport> mImports;
  62. Dictionary<uint32, uint32> mExportMap;
  63. int mModuleIdx;
  64. CvCompileUnit(DbgModule* dbgModule) : DbgCompileUnit(dbgModule)
  65. {
  66. }
  67. };
  68. struct CvModuleInfo : public CvModuleInfoBase
  69. {
  70. const char* mModuleName;
  71. const char* mObjectName;
  72. CvCompileUnit* mCompileUnit;
  73. int mIdx;
  74. bool mHasMappedMethods;
  75. };
  76. struct CvStringTable
  77. {
  78. int mStream;
  79. int mStreamOffset;
  80. const char* mStrTable;
  81. CvStringTable()
  82. {
  83. mStream = -1;
  84. mStreamOffset = 0;
  85. mStrTable = NULL;
  86. }
  87. };
  88. enum CvSymStreamType
  89. {
  90. CvSymStreamType_Globals_Scan,
  91. CvSymStreamType_Globals_Targeted,
  92. CvSymStreamType_Symbols
  93. };
  94. struct CvModuleRef
  95. {
  96. CvModuleRef* mNext;
  97. int mModule;
  98. };
  99. struct CvInlineInfo
  100. {
  101. CvInlineInfo* mNext;
  102. CvInlineInfo* mTail;
  103. DbgSubprogram* mSubprogram;
  104. uint8* mData;
  105. int mDataLen;
  106. int mInlinee;
  107. bool mDebugDump;
  108. };
  109. typedef Array<CvInlineInfo> CvInlineInfoVec;
  110. class CvModuleInfoNameEntry
  111. {
  112. public:
  113. CvModuleInfo* mModuleInfo;
  114. bool operator==(const CvModuleInfoNameEntry& other) const
  115. {
  116. return mModuleInfo == other.mModuleInfo;
  117. }
  118. static size_t GetHashCode(const char* str, int len)
  119. {
  120. int curHash = 0;
  121. const char* strP = str;
  122. for (int i = 0; i < len; i++)
  123. {
  124. char c = *(strP++);
  125. if (c == 0)
  126. break;
  127. c = tolower(c);
  128. curHash = ((curHash ^ c) << 5) - curHash;
  129. }
  130. return curHash;
  131. }
  132. static size_t GetHashCode(const StringImpl& str)
  133. {
  134. for (int i = str.mLength - 1; i >= 0; i--)
  135. {
  136. char c = str[i];
  137. if ((c == '\\') || (c == '/'))
  138. {
  139. return GetHashCode((const char*)&str[i], str.mLength - i);
  140. }
  141. }
  142. if (str.mLength == 0)
  143. return 0;
  144. return GetHashCode((const char*)&str[0], str.mLength);
  145. }
  146. };
  147. class COFF;
  148. class CvStreamReader
  149. {
  150. public:
  151. COFF* mCOFF;
  152. int mPageBits;
  153. Array<uint8*> mStreamPtrs;
  154. Array<uint8> mTempData;
  155. int mSize;
  156. public:
  157. CvStreamReader()
  158. {
  159. mCOFF = NULL;
  160. mPageBits = 0;
  161. mSize = 0;
  162. }
  163. bool IsSetup()
  164. {
  165. return mCOFF != NULL;
  166. }
  167. uint8* GetTempPtr(int offset, int size, bool mayRecurse = false, bool* madeCopy = NULL);
  168. uint8* GetPermanentPtr(int offset, int size, bool* madeCopy = NULL);
  169. //char* GetPermanentCharPtr(int offset, int size);
  170. };
  171. class CvLibInfo
  172. {
  173. public:
  174. BeLibFile mLibFile;
  175. Dictionary<String, BeLibEntry*> mSymDict;
  176. };
  177. class COFF : public DbgModule
  178. {
  179. public:
  180. enum ParseKind
  181. {
  182. ParseKind_Header,
  183. ParseKind_Info,
  184. ParseKind_Full
  185. };
  186. public:
  187. ZipFile* mEmitSourceFile;
  188. uint8 mWantPDBGuid[16];
  189. int mWantAge;
  190. uint8 mPDBGuid[16];
  191. int mFileAge;
  192. int mDebugAge;
  193. ParseKind mParseKind;
  194. bool mPDBLoaded;
  195. bool mIs64Bit;
  196. int mCvPageSize;
  197. int mCvPageBits;
  198. int mCvMinTag;
  199. int mCvMaxTag;
  200. int mCvIPIMinTag;
  201. int mCvIPIMaxTag;
  202. //Array<void*> mCvTagData; // a DbgType* for type info, or a ptr to the data stream for child info
  203. Array<DbgType*> mCvTypeMap;
  204. Array<int> mCvTagStartMap;
  205. Array<int> mCvIPITagStartMap;
  206. Array<Array<uint8>> mTempBufs;
  207. int mTempBufIdx;
  208. Array<DbgType*> mCvSystemTypes;
  209. Array<int32> mCvStreamSizes;
  210. Array<int32> mCvStreamPtrStartIdxs;
  211. Array<int32> mCvStreamPtrs;
  212. CvStreamReader mCvTypeSectionReader;
  213. CvStreamReader mCvIPIReader;
  214. CvStreamReader mCvSymbolRecordReader;
  215. StringT<128> mPDBPath;
  216. StringT<128> mOrigPDBPath;
  217. SafeMemStream* mCvDataStream;
  218. CvStringTable mStringTable;
  219. uint8* mCvHeaderData;
  220. //uint8* mCvTypeSectionData
  221. uint8* mCvStrTableData;
  222. uint8* mCvPublicSymbolData;
  223. uint8* mCvGlobalSymbolData;
  224. uint8* mNewFPOData;
  225. int mCvGlobalSymbolInfoStream;
  226. int mCvPublicSymbolInfoStream;
  227. int mCvSymbolRecordStream;
  228. int mCvSrcSrvStream;
  229. int mCvEmitStream;
  230. int mCvNewFPOStream;
  231. Array<CvModuleInfo*> mCvModuleInfo;
  232. Dictionary<int, DbgSrcFile*> mCVSrcFileRefCache;
  233. Dictionary<CaseInsensitiveString, CvModuleInfo*> mModuleNameMap;
  234. HashSet<CvModuleInfoNameEntry> mModuleNameSet;
  235. Dictionary<String, CvLibInfo*> mHotLibMap;
  236. Dictionary<String, BeLibEntry*> mHotLibSymMap;
  237. addr_target mHotThunkCurAddr;
  238. int mHotThunkDataLeft;
  239. DbgType* mGlobalsTargetType;
  240. const char* mPrevScanName;
  241. // For hot data
  242. Array<DbgSectionData> mCvTypeSectionData;
  243. Array<DbgSectionData> mCvCompileUnitData;
  244. //int mCvTypeSectionDataSize;
  245. //uint8* mCvCompileUnitData;
  246. //int mCvCompileUnitDataSize;
  247. HANDLE mCvMappedFile;
  248. void* mCvMappedViewOfFile;
  249. size_t mCvMappedFileSize;
  250. HANDLE mCvMappedFileMapping;
  251. bool mIsFastLink;
  252. bool mTriedSymSrv;
  253. DbgSymRequest* mDbgSymRequest;
  254. bool mWantsAutoLoadDebugInfo;
  255. int mProcSymCount;
  256. public:
  257. virtual void Fail(const StringImpl& error) override;
  258. virtual void SoftFail(const StringImpl& error);
  259. virtual void HardFail(const StringImpl& error) override;
  260. virtual void ParseGlobalsData() override;
  261. virtual void ParseSymbolData() override;
  262. virtual void ParseTypeData(CvStreamReader& reader, int dataOffset);
  263. void ParseTypeData(int sectionNum, CvStreamReader& reader, int& sectionSize, int& dataOfs, int& hashStream, int& hashAdjOffset, int& hashAdjSize, int& minVal, int& maxVal);
  264. virtual void ParseTypeData() override;
  265. void ParseCompileUnit_Symbols(DbgCompileUnit* compileUnit, uint8* sectionData, uint8* data, uint8* dataEnd, CvInlineInfoVec& inlineDataVec, bool deferInternals, DbgSubprogram* useSubprogram);
  266. CvCompileUnit* ParseCompileUnit(CvModuleInfo* moduleInfo, CvCompileUnit* compileUnit, uint8* sectionData, int sectionSize);
  267. virtual CvCompileUnit* ParseCompileUnit(int compileUnitId) override;
  268. virtual void ParseCompileUnits() override;
  269. virtual void MapCompileUnitMethods(DbgCompileUnit* compileUnit) override;
  270. virtual void MapCompileUnitMethods(int compileUnitId) override;
  271. virtual void PopulateType(DbgType* dbgType) override;
  272. virtual void PopulateTypeGlobals(DbgType* dbgType) override;
  273. virtual void PopulateSubprogram(DbgSubprogram* dbgSubprogram) override;
  274. void FixSubprogramName(DbgSubprogram * dbgSubprogram);
  275. int MapImport(CvCompileUnit* compileUnit, int Id);
  276. void FixupInlinee(DbgSubprogram* dbgSubprogram, uint32 ipiTag);
  277. virtual void FixupInlinee(DbgSubprogram* dbgSubprogram) override;
  278. virtual void PopulateStaticVariableMap() override;
  279. virtual void ProcessDebugInfo() override;
  280. virtual void FinishHotSwap() override;
  281. virtual intptr EvaluateLocation(DbgSubprogram* dwSubprogram, const uint8* locData, int locDataLen, WdStackFrame* stackFrame, DbgAddrType* outAddrType, DbgEvalLocFlags flags = DbgEvalLocFlag_None) override;
  282. virtual bool CanGetOldSource() override;
  283. virtual String GetOldSourceCommand(const StringImpl& path) override;
  284. virtual bool GetEmitSource(const StringImpl& filePath, String& outText) override;
  285. virtual bool HasPendingDebugInfo() override;
  286. virtual void PreCacheImage() override;
  287. virtual void PreCacheDebugInfo() override;
  288. virtual bool RequestImage() override;
  289. virtual bool RequestDebugInfo(bool allowRemote) override;
  290. virtual bool WantsAutoLoadDebugInfo() override;
  291. virtual bool DbgIsStrMutable(const char* str) override;
  292. virtual addr_target LocateSymbol(const StringImpl& name) override;
  293. virtual void ParseFrameDescriptors() override;
  294. bool LoadModuleImage(const StringImpl& imagePath);
  295. void FixConstant(DbgVariable* variable);
  296. void MapRanges(DbgVariable* variable, CV_LVAR_ADDR_RANGE* range, CV_LVAR_ADDR_GAP* gaps);
  297. void MakeThis(DbgSubprogram* curSubprogram, DbgVariable*& curParam);
  298. const char* CvCheckTargetMatch(const char* name, bool& wasBeef);
  299. int CvGetStringHash(const char* str);
  300. void CvFixupName(char* name);
  301. DbgType* CvGetTypeOrNamespace(char* name, DbgLanguage language = DbgLanguage_Unknown);
  302. void ParseSymbolStream(CvSymStreamType symStreamType);
  303. void ScanCompileUnit(int compileUnitId);
  304. void ParseFrameDescriptors(uint8* data, int size, addr_target baseAddr);
  305. const char* CvParseSymbol(int offset, CvSymStreamType symStreamType, addr_target& outAddr);
  306. uint8* HandleSymStreamEntries(CvSymStreamType symStreamType, uint8* data, uint8* addrMap);
  307. const char* CvParseString(uint8*& data);
  308. const char* CvParseAndDupString(uint8*& data);
  309. const char* CvDupString(const char* str, int strLen);
  310. void CvReadStream(int sectionIdx, CvStreamReader& streamReader);
  311. void CvInitStreamRaw(CvStreamReader& streamReader, uint8* data, int size);
  312. uint8* CvReadStream(int sectionIdx, int* outSize = NULL);
  313. uint8* CvReadStreamSegment(int sectionIdx, int offset, int size);
  314. void ReleaseTempBuf(uint8* buf);
  315. void InitCvTypes();
  316. DbgType* CvCreateType();
  317. int CvConvRegNum(int regNum, int* outBits = NULL);
  318. addr_target GetSectionAddr(uint16 section, uint32 offset);
  319. int64 CvParseConstant(uint16 constVal, uint8*& data);
  320. int64 CvParseConstant(uint8*& data);
  321. DbgType* CvGetType(int typeId);
  322. DbgType* CvGetTypeSafe(int typeId);
  323. DbgType* CvGetType(int typeId, CvCompileUnit* compileUnit);
  324. int CvGetTagStart(int tagIdx, bool ipi);
  325. int CvGetTagSize(int tagIdx, bool ipi);
  326. uint8* CvGetTagData(int tagIdx, bool ipi, int* outDataSize = NULL);
  327. void CvParseArgList(DbgSubprogram* subprogram, int tagIdx, bool ipi);
  328. DbgSubprogram* CvParseMethod(DbgType* parentType, const char* methodName, int tagIdx, bool ipi, DbgSubprogram* subprogram = NULL);
  329. void CvParseMethodList(DbgType* parentType, const char* methodName, int tagIdx, bool ipi);
  330. void CvParseMembers(DbgType* parentType, int tagIdx, bool ipi);
  331. DbgType* CvParseType(int tagIdx, bool ipi = false);
  332. bool CvParseDBI(int wantAge);
  333. void ParseSectionHeader(int sectionIdx);
  334. void CvParseIPI();
  335. bool CvParseHeader(uint8 wantGuid[16], int32 wantAge);
  336. void FixTypes(int startingIdx);
  337. bool ParseCv(DataStream& CvFS, uint8* rootDirData, int pageSize, uint8 wantGuid[16], int32 wantAge);
  338. bool TryLoadPDB(const String& CvPath, uint8 wantGuid[16], int32 wantAge);
  339. void ClosePDB();
  340. virtual void ReportMemory(MemReporter* memReporter) override;
  341. public:
  342. COFF(DebugTarget* debugTarget);
  343. ~COFF();
  344. virtual bool LoadPDB(const String& CvPath, uint8 wantGuid[16], int32 wantAge) override;
  345. virtual bool CheckSection(const char* name, uint8* sectionData,
  346. int sectionSize) override;
  347. };
  348. class CvAutoReleaseTempData
  349. {
  350. public:
  351. COFF * mCOFF;
  352. uint8* mData;
  353. public:
  354. CvAutoReleaseTempData(COFF* coff, uint8* data)
  355. {
  356. mCOFF = coff;
  357. mData = data;
  358. }
  359. ~CvAutoReleaseTempData()
  360. {
  361. mCOFF->ReleaseTempBuf(mData);
  362. }
  363. };
  364. NS_BF_DBG_END
  365. namespace std
  366. {
  367. template<>
  368. struct hash<NS_BF_DBG::CvModuleInfoNameEntry>
  369. {
  370. size_t operator()(const NS_BF_DBG::CvModuleInfoNameEntry& val) const
  371. {
  372. return NS_BF_DBG::CvModuleInfoNameEntry::GetHashCode(Beefy::StringImpl::MakeRef(val.mModuleInfo->mModuleName));
  373. }
  374. };
  375. }