Merge commit '61667dedf55e3e5aa584f7ae2bd0471336b92ce9' into sync_cg_clif-2021-09-19
This commit is contained in:
@@ -1,16 +1,16 @@
|
||||
//! Write the debuginfo into an object file.
|
||||
|
||||
use cranelift_object::ObjectProduct;
|
||||
use rustc_data_structures::fx::FxHashMap;
|
||||
|
||||
use gimli::write::{Address, AttributeValue, EndianVec, Result, Sections, Writer};
|
||||
use gimli::{RunTimeEndian, SectionId};
|
||||
|
||||
use crate::backend::WriteDebugInfo;
|
||||
|
||||
use super::object::WriteDebugInfo;
|
||||
use super::DebugContext;
|
||||
|
||||
impl DebugContext<'_> {
|
||||
pub(crate) fn emit<P: WriteDebugInfo>(&mut self, product: &mut P) {
|
||||
pub(crate) fn emit(&mut self, product: &mut ObjectProduct) {
|
||||
let unit_range_list_id = self.dwarf.unit.ranges.add(self.unit_range_list.clone());
|
||||
let root = self.dwarf.unit.root();
|
||||
let root = self.dwarf.unit.get_mut(root);
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
mod emit;
|
||||
mod line_info;
|
||||
mod object;
|
||||
mod unwind;
|
||||
|
||||
use crate::prelude::*;
|
||||
|
||||
85
compiler/rustc_codegen_cranelift/src/debuginfo/object.rs
Normal file
85
compiler/rustc_codegen_cranelift/src/debuginfo/object.rs
Normal file
@@ -0,0 +1,85 @@
|
||||
use std::convert::{TryFrom, TryInto};
|
||||
|
||||
use rustc_data_structures::fx::FxHashMap;
|
||||
|
||||
use cranelift_module::FuncId;
|
||||
use cranelift_object::ObjectProduct;
|
||||
|
||||
use object::write::{Relocation, StandardSegment};
|
||||
use object::{RelocationEncoding, SectionKind};
|
||||
|
||||
use gimli::SectionId;
|
||||
|
||||
use crate::debuginfo::{DebugReloc, DebugRelocName};
|
||||
|
||||
pub(super) trait WriteDebugInfo {
|
||||
type SectionId: Copy;
|
||||
|
||||
fn add_debug_section(&mut self, name: SectionId, data: Vec<u8>) -> Self::SectionId;
|
||||
fn add_debug_reloc(
|
||||
&mut self,
|
||||
section_map: &FxHashMap<SectionId, Self::SectionId>,
|
||||
from: &Self::SectionId,
|
||||
reloc: &DebugReloc,
|
||||
);
|
||||
}
|
||||
|
||||
impl WriteDebugInfo for ObjectProduct {
|
||||
type SectionId = (object::write::SectionId, object::write::SymbolId);
|
||||
|
||||
fn add_debug_section(
|
||||
&mut self,
|
||||
id: SectionId,
|
||||
data: Vec<u8>,
|
||||
) -> (object::write::SectionId, object::write::SymbolId) {
|
||||
let name = if self.object.format() == object::BinaryFormat::MachO {
|
||||
id.name().replace('.', "__") // machO expects __debug_info instead of .debug_info
|
||||
} else {
|
||||
id.name().to_string()
|
||||
}
|
||||
.into_bytes();
|
||||
|
||||
let segment = self.object.segment_name(StandardSegment::Debug).to_vec();
|
||||
// FIXME use SHT_X86_64_UNWIND for .eh_frame
|
||||
let section_id = self.object.add_section(
|
||||
segment,
|
||||
name,
|
||||
if id == SectionId::EhFrame { SectionKind::ReadOnlyData } else { SectionKind::Debug },
|
||||
);
|
||||
self.object
|
||||
.section_mut(section_id)
|
||||
.set_data(data, if id == SectionId::EhFrame { 8 } else { 1 });
|
||||
let symbol_id = self.object.section_symbol(section_id);
|
||||
(section_id, symbol_id)
|
||||
}
|
||||
|
||||
fn add_debug_reloc(
|
||||
&mut self,
|
||||
section_map: &FxHashMap<SectionId, Self::SectionId>,
|
||||
from: &Self::SectionId,
|
||||
reloc: &DebugReloc,
|
||||
) {
|
||||
let (symbol, symbol_offset) = match reloc.name {
|
||||
DebugRelocName::Section(id) => (section_map.get(&id).unwrap().1, 0),
|
||||
DebugRelocName::Symbol(id) => {
|
||||
let symbol_id = self.function_symbol(FuncId::from_u32(id.try_into().unwrap()));
|
||||
self.object
|
||||
.symbol_section_and_offset(symbol_id)
|
||||
.expect("Debug reloc for undef sym???")
|
||||
}
|
||||
};
|
||||
self.object
|
||||
.add_relocation(
|
||||
from.0,
|
||||
Relocation {
|
||||
offset: u64::from(reloc.offset),
|
||||
symbol,
|
||||
kind: reloc.kind,
|
||||
encoding: RelocationEncoding::Generic,
|
||||
size: reloc.size * 8,
|
||||
addend: i64::try_from(symbol_offset).unwrap() + reloc.addend,
|
||||
},
|
||||
)
|
||||
.unwrap();
|
||||
}
|
||||
}
|
||||
@@ -4,10 +4,11 @@ use crate::prelude::*;
|
||||
|
||||
use cranelift_codegen::isa::{unwind::UnwindInfo, TargetIsa};
|
||||
|
||||
use cranelift_object::ObjectProduct;
|
||||
use gimli::write::{Address, CieId, EhFrame, FrameTable, Section};
|
||||
use gimli::RunTimeEndian;
|
||||
|
||||
use crate::backend::WriteDebugInfo;
|
||||
use super::object::WriteDebugInfo;
|
||||
|
||||
pub(crate) struct UnwindContext {
|
||||
endian: RunTimeEndian,
|
||||
@@ -55,7 +56,7 @@ impl UnwindContext {
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn emit<P: WriteDebugInfo>(self, product: &mut P) {
|
||||
pub(crate) fn emit(self, product: &mut ObjectProduct) {
|
||||
let mut eh_frame = EhFrame::from(super::emit::WriterRelocate::new(self.endian));
|
||||
self.frame_table.write_eh_frame(&mut eh_frame).unwrap();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user