void ClangDocBitcodeWriter::emitBlock(const RecordInfo &I) { StreamSubBlockGuard Block(Stream, BI_RECORD_BLOCK_ID); emitRecord(I.USR, RECORD_USR); emitRecord(I.Name, RECORD_NAME); for (const auto &N : I.Namespace) emitBlock(N, FieldId::F_namespace); for (const auto &CI : I.Description) emitBlock(CI); if (I.DefLoc) emitRecord(I.DefLoc.getValue(), RECORD_DEFLOCATION); for (const auto &L : I.Loc) emitRecord(L, RECORD_LOCATION); emitRecord(I.TagType, RECORD_TAG_TYPE); for (const auto &N : I.Members) emitBlock(N); for (const auto &P : I.Parents) emitBlock(P, FieldId::F_parent); for (const auto &P : I.VirtualParents) emitBlock(P, FieldId::F_vparent); for (const auto &C : I.ChildRecords) emitBlock(C, FieldId::F_child_record); for (const auto &C : I.ChildFunctions) emitBlock(C); for (const auto &C : I.ChildEnums) emitBlock(C); }
void ClangDocBitcodeWriter::emitBlock(const Reference &R, FieldId Field) { if (R.USR == EmptySID && R.Name.empty()) return; StreamSubBlockGuard Block(Stream, BI_REFERENCE_BLOCK_ID); emitRecord(R.USR, REFERENCE_USR); emitRecord(R.Name, REFERENCE_NAME); emitRecord((unsigned)R.RefType, REFERENCE_TYPE); emitRecord((unsigned)Field, REFERENCE_FIELD); }
void CodeViewDebug::emitTypeInformation() { // Start the .debug$T section with 0x4. Asm->OutStreamer->SwitchSection( Asm->getObjFileLowering().getCOFFDebugTypesSection()); Asm->EmitInt32(COFF::DEBUG_SECTION_MAGIC); NamedMDNode *CU_Nodes = Asm->MMI->getModule()->getNamedMetadata("llvm.dbg.cu"); if (!CU_Nodes) return; // This type info currently only holds function ids for use with inline call // frame info. All functions are assigned a simple 'void ()' type. Emit that // type here. TypeIndex ArgListIdx = getNextTypeIndex(); Asm->EmitInt16(2 + sizeof(ArgList)); Asm->EmitInt16(LF_ARGLIST); Asm->EmitInt32(0); TypeIndex VoidProcIdx = getNextTypeIndex(); Asm->EmitInt16(2 + sizeof(ProcedureType)); Asm->EmitInt16(LF_PROCEDURE); ProcedureType Proc{}; // Zero initialize. Proc.ReturnType = TypeIndex::Void(); Proc.CallConv = CallingConvention::NearC; Proc.Options = FunctionOptions::None; Proc.NumParameters = 0; Proc.ArgListType = ArgListIdx; emitRecord(*Asm->OutStreamer, Proc); for (MDNode *N : CU_Nodes->operands()) { auto *CUNode = cast<DICompileUnit>(N); for (auto *SP : CUNode->getSubprograms()) { StringRef DisplayName = SP->getDisplayName(); Asm->EmitInt16(2 + sizeof(FuncId) + DisplayName.size() + 1); Asm->EmitInt16(LF_FUNC_ID); FuncId Func{}; // Zero initialize. Func.ParentScope = TypeIndex(); Func.FunctionType = VoidProcIdx; emitRecord(*Asm->OutStreamer, Func); Asm->OutStreamer->EmitBytes(DisplayName); Asm->EmitInt8(0); TypeIndex FuncIdIdx = getNextTypeIndex(); SubprogramToFuncId.insert(std::make_pair(SP, FuncIdIdx)); } } }
void ClangDocBitcodeWriter::emitBlock(const NamespaceInfo &I) { StreamSubBlockGuard Block(Stream, BI_NAMESPACE_BLOCK_ID); emitRecord(I.USR, NAMESPACE_USR); emitRecord(I.Name, NAMESPACE_NAME); for (const auto &N : I.Namespace) emitBlock(N, FieldId::F_namespace); for (const auto &CI : I.Description) emitBlock(CI); for (const auto &C : I.ChildNamespaces) emitBlock(C, FieldId::F_child_namespace); for (const auto &C : I.ChildRecords) emitBlock(C, FieldId::F_child_record); for (const auto &C : I.ChildFunctions) emitBlock(C); for (const auto &C : I.ChildEnums) emitBlock(C); }
void ClangDocBitcodeWriter::emitBlock(const FunctionInfo &I) { StreamSubBlockGuard Block(Stream, BI_FUNCTION_BLOCK_ID); emitRecord(I.USR, FUNCTION_USR); emitRecord(I.Name, FUNCTION_NAME); for (const auto &N : I.Namespace) emitBlock(N, FieldId::F_namespace); for (const auto &CI : I.Description) emitBlock(CI); emitRecord(I.IsMethod, FUNCTION_IS_METHOD); if (I.DefLoc) emitRecord(I.DefLoc.getValue(), FUNCTION_DEFLOCATION); for (const auto &L : I.Loc) emitRecord(L, FUNCTION_LOCATION); emitBlock(I.Parent, FieldId::F_parent); emitBlock(I.ReturnType); for (const auto &N : I.Params) emitBlock(N); }
void ClangDocBitcodeWriter::emitBlock(const EnumInfo &I) { StreamSubBlockGuard Block(Stream, BI_ENUM_BLOCK_ID); emitRecord(I.USR, ENUM_USR); emitRecord(I.Name, ENUM_NAME); for (const auto &N : I.Namespace) emitBlock(N, FieldId::F_namespace); for (const auto &CI : I.Description) emitBlock(CI); if (I.DefLoc) emitRecord(I.DefLoc.getValue(), ENUM_DEFLOCATION); for (const auto &L : I.Loc) emitRecord(L, ENUM_LOCATION); emitRecord(I.Scoped, ENUM_SCOPED); for (const auto &N : I.Members) emitRecord(N, ENUM_MEMBER); }
void ClangDocBitcodeWriter::emitBlock(const CommentInfo &I) { StreamSubBlockGuard Block(Stream, BI_COMMENT_BLOCK_ID); for (const auto &L : std::vector<std::pair<llvm::StringRef, RecordId>>{ {I.Kind, COMMENT_KIND}, {I.Text, COMMENT_TEXT}, {I.Name, COMMENT_NAME}, {I.Direction, COMMENT_DIRECTION}, {I.ParamName, COMMENT_PARAMNAME}, {I.CloseName, COMMENT_CLOSENAME}}) emitRecord(L.first, L.second); emitRecord(I.SelfClosing, COMMENT_SELFCLOSING); emitRecord(I.Explicit, COMMENT_EXPLICIT); for (const auto &A : I.AttrKeys) emitRecord(A, COMMENT_ATTRKEY); for (const auto &A : I.AttrValues) emitRecord(A, COMMENT_ATTRVAL); for (const auto &A : I.Args) emitRecord(A, COMMENT_ARG); for (const auto &C : I.Children) emitBlock(*C); }
void ClangDocBitcodeWriter::emitBlock(const MemberTypeInfo &T) { StreamSubBlockGuard Block(Stream, BI_MEMBER_TYPE_BLOCK_ID); emitBlock(T.Type, FieldId::F_type); emitRecord(T.Name, MEMBER_TYPE_NAME); emitRecord(T.Access, MEMBER_TYPE_ACCESS); }
void ClangDocBitcodeWriter::emitBlock(const FieldTypeInfo &T) { StreamSubBlockGuard Block(Stream, BI_FIELD_TYPE_BLOCK_ID); emitBlock(T.Type, FieldId::F_type); emitRecord(T.Name, FIELD_TYPE_NAME); }
void ClangDocBitcodeWriter::emitVersionBlock() { StreamSubBlockGuard Block(Stream, BI_VERSION_BLOCK_ID); emitRecord(VersionNumber, VERSION); }