示例#1
0
        public override void Emit(DwarfWriteContext ctx)
        {
            var abbr = ctx.CreateAbbrev(DwarfTag.DW_TAG_compile_unit, new List <DwarfAbbrevAttribute>()
            {
                new DwarfAbbrevAttribute {
                    Attribute = DwarfAttribute.DW_AT_producer, Form = DwarfForm.DW_FORM_string
                },
                new DwarfAbbrevAttribute {
                    Attribute = DwarfAttribute.DW_AT_low_pc, Form = DwarfForm.DW_FORM_addr
                },
                new DwarfAbbrevAttribute {
                    Attribute = DwarfAttribute.DW_AT_high_pc, Form = DwarfForm.DW_FORM_addr
                },
                new DwarfAbbrevAttribute {
                    Attribute = DwarfAttribute.DW_AT_stmt_list, Form = DwarfForm.DW_FORM_data4
                },
            });

            ctx.Writer.WriteULEB128(0x01);             //number of tag.

            ctx.Writer.WriteNullTerminatedString(Producer);
            ctx.Writer.Write(ProgramCounterLow);             // TODO: Dynamic
            ctx.Writer.Write(ProgramCounterHigh);            // TODO: Dynamic
            ctx.Writer.Write((uint)0);
        }
示例#2
0
        private Stream EmitDebugInfo()
        {
            var stream = new MemoryStream();
            var writer = new BinaryWriter(stream);

            // note: Compilation Unit Header != Debugging Information Entry

            // Compilation Unit Header
            var compilationUnitSizePosition = writer.GetPosition();

            writer.Write((uint)7);           // length
            writer.Write((ushort)0x02);      // version
            writer.Write((uint)0);           // abbr tag offset.
            writer.WriteByte(4);             //addr size of platform

            var context = new DwarfWriteContext {
                Writer = writer, AbbrevList = AbbrevList
            };

            var textSection = Linker.Sections[(int)SectionKind.Text];

            // Debugging Information Entry
            var cu = new DwarfCompilationUnit
            {
                Producer           = "Mosa Compiler",
                ProgramCounterLow  = (uint)textSection.VirtualAddress,
                ProgramCounterHigh = (uint)textSection.VirtualAddress + textSection.Size
            };

            cu.Emit(context);

            uint compilationUnitSize = (uint)(writer.GetPosition() - compilationUnitSizePosition - sizeof(uint));

            writer.SetPosition(compilationUnitSizePosition);
            writer.Write(compilationUnitSize);
            writer.SetPosition(writer.BaseStream.Length);

            return(stream);
        }
示例#3
0
 public virtual void Emit(DwarfWriteContext ctx)
 {
 }