COFF.h 11 KB

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