Skip to content

Commit 4ed08b5

Browse files
committed
Add new TransItem for global_asm trans
1 parent c54f935 commit 4ed08b5

File tree

5 files changed

+62
-14
lines changed

5 files changed

+62
-14
lines changed

src/librustc_trans/asm.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,3 +124,11 @@ pub fn trans_inline_asm<'a, 'tcx>(
124124
llvm::LLVMMDNodeInContext(bcx.ccx.llcx(), &val, 1));
125125
}
126126
}
127+
128+
pub fn trans_global_asm<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>,
129+
ga: &hir::GlobalAsm) {
130+
let asm = CString::new(ga.asm.as_str().as_bytes()).unwrap();
131+
unsafe {
132+
llvm::LLVMSetModuleInlineAsm(ccx.llmod(), asm.as_ptr());
133+
}
134+
}

src/librustc_trans/collector.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,9 @@ fn collect_items_rec<'a, 'tcx: 'a>(scx: &SharedCrateContext<'a, 'tcx>,
349349

350350
collect_neighbours(scx, instance, &mut neighbors);
351351
}
352+
TransItem::GlobalAsm(..) => {
353+
recursion_depth_reset = None;
354+
}
352355
}
353356

354357
record_inlining_canditates(scx.tcx(), starting_point, &neighbors[..], inlining_map);
@@ -811,7 +814,6 @@ impl<'b, 'a, 'v> ItemLikeVisitor<'v> for RootCollector<'b, 'a, 'v> {
811814
hir::ItemExternCrate(..) |
812815
hir::ItemUse(..) |
813816
hir::ItemForeignMod(..) |
814-
hir::ItemGlobalAsm(..) |
815817
hir::ItemTy(..) |
816818
hir::ItemDefaultImpl(..) |
817819
hir::ItemTrait(..) |
@@ -841,6 +843,12 @@ impl<'b, 'a, 'v> ItemLikeVisitor<'v> for RootCollector<'b, 'a, 'v> {
841843
}
842844
}
843845
}
846+
hir::ItemGlobalAsm(..) => {
847+
debug!("RootCollector: ItemGlobalAsm({})",
848+
def_id_to_string(self.scx.tcx(),
849+
self.scx.tcx().hir.local_def_id(item.id)));
850+
self.output.push(TransItem::GlobalAsm(item.id));
851+
}
844852
hir::ItemStatic(..) => {
845853
debug!("RootCollector: ItemStatic({})",
846854
def_id_to_string(self.scx.tcx(),

src/librustc_trans/partitioning.rs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -185,15 +185,16 @@ impl<'tcx> CodegenUnit<'tcx> {
185185
symbol_name.len().hash(&mut state);
186186
symbol_name.hash(&mut state);
187187
let exported = match item {
188-
TransItem::Fn(ref instance) => {
189-
let node_id =
190-
scx.tcx().hir.as_local_node_id(instance.def_id());
188+
TransItem::Fn(ref instance) => {
189+
let node_id =
190+
scx.tcx().hir.as_local_node_id(instance.def_id());
191191
node_id.map(|node_id| exported_symbols.contains(&node_id))
192-
.unwrap_or(false)
193-
}
194-
TransItem::Static(node_id) => {
192+
.unwrap_or(false)
193+
}
194+
TransItem::Static(node_id) => {
195195
exported_symbols.contains(&node_id)
196-
}
196+
}
197+
TransItem::GlobalAsm(..) => true,
197198
};
198199
exported.hash(&mut state);
199200
}
@@ -243,7 +244,9 @@ impl<'tcx> CodegenUnit<'tcx> {
243244
TransItem::Fn(instance) => {
244245
tcx.hir.as_local_node_id(instance.def_id())
245246
}
246-
TransItem::Static(node_id) => Some(node_id),
247+
TransItem::Static(node_id) | TransItem::GlobalAsm(node_id) => {
248+
Some(node_id)
249+
}
247250
}
248251
}
249252
}
@@ -338,7 +341,8 @@ fn place_root_translation_items<'a, 'tcx, I>(scx: &SharedCrateContext<'a, 'tcx>,
338341
None => {
339342
match trans_item {
340343
TransItem::Fn(..) |
341-
TransItem::Static(..) => llvm::ExternalLinkage,
344+
TransItem::Static(..) |
345+
TransItem::GlobalAsm(..) => llvm::ExternalLinkage,
342346
}
343347
}
344348
};
@@ -483,7 +487,8 @@ fn characteristic_def_id_of_trans_item<'a, 'tcx>(scx: &SharedCrateContext<'a, 't
483487

484488
Some(def_id)
485489
}
486-
TransItem::Static(node_id) => Some(tcx.hir.local_def_id(node_id)),
490+
TransItem::Static(node_id) |
491+
TransItem::GlobalAsm(node_id) => Some(tcx.hir.local_def_id(node_id)),
487492
}
488493
}
489494

src/librustc_trans/symbol_map.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,10 @@ impl<'tcx> SymbolMap<'tcx> {
9999
TransItem::Fn(Instance { def, .. }) => {
100100
tcx.hir.as_local_node_id(def.def_id())
101101
}
102-
TransItem::Static(node_id) => Some(node_id),
102+
TransItem::Static(node_id) |
103+
TransItem::GlobalAsm(node_id) => {
104+
Some(node_id)
105+
}
103106
}.map(|node_id| {
104107
tcx.hir.span(node_id)
105108
})

src/librustc_trans/trans_item.rs

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
//! item-path. This is used for unit testing the code that generates
1515
//! paths etc in all kinds of annoying scenarios.
1616
17+
use asm;
1718
use attributes;
1819
use base;
1920
use consts;
@@ -38,7 +39,8 @@ use std::iter;
3839
#[derive(PartialEq, Eq, Clone, Copy, Debug, Hash)]
3940
pub enum TransItem<'tcx> {
4041
Fn(Instance<'tcx>),
41-
Static(NodeId)
42+
Static(NodeId),
43+
GlobalAsm(NodeId),
4244
}
4345

4446
/// Describes how a translation item will be instantiated in object files.
@@ -89,6 +91,14 @@ impl<'a, 'tcx> TransItem<'tcx> {
8991
span_bug!(item.span, "Mismatch between hir::Item type and TransItem type")
9092
}
9193
}
94+
TransItem::GlobalAsm(node_id) => {
95+
let item = ccx.tcx().hir.expect_item(node_id);
96+
if let hir::ItemGlobalAsm(ref ga) = item.node {
97+
asm::trans_global_asm(ccx, ga);
98+
} else {
99+
span_bug!(item.span, "Mismatch between hir::Item type and TransItem type")
100+
}
101+
}
92102
TransItem::Fn(instance) => {
93103
let _task = ccx.tcx().dep_graph.in_task(
94104
DepNode::TransCrateItem(instance.def_id())); // (*)
@@ -123,6 +133,7 @@ impl<'a, 'tcx> TransItem<'tcx> {
123133
TransItem::Fn(instance) => {
124134
TransItem::predefine_fn(ccx, instance, linkage, &symbol_name);
125135
}
136+
TransItem::GlobalAsm(..) => {}
126137
}
127138

128139
debug!("END PREDEFINING '{} ({})' in cgu {}",
@@ -185,6 +196,10 @@ impl<'a, 'tcx> TransItem<'tcx> {
185196
let def_id = scx.tcx().hir.local_def_id(node_id);
186197
symbol_names::symbol_name(Instance::mono(scx.tcx(), def_id), scx)
187198
}
199+
TransItem::GlobalAsm(node_id) => {
200+
let def_id = scx.tcx().hir.local_def_id(node_id);
201+
format!("global_asm_{:?}", def_id)
202+
}
188203
}
189204
}
190205

@@ -202,6 +217,7 @@ impl<'a, 'tcx> TransItem<'tcx> {
202217
}
203218
}
204219
TransItem::Static(..) => InstantiationMode::GloballyShared,
220+
TransItem::GlobalAsm(..) => InstantiationMode::GloballyShared,
205221
}
206222
}
207223

@@ -210,14 +226,16 @@ impl<'a, 'tcx> TransItem<'tcx> {
210226
TransItem::Fn(ref instance) => {
211227
instance.substs.types().next().is_some()
212228
}
213-
TransItem::Static(..) => false,
229+
TransItem::Static(..) |
230+
TransItem::GlobalAsm(..) => false,
214231
}
215232
}
216233

217234
pub fn explicit_linkage(&self, tcx: TyCtxt<'a, 'tcx, 'tcx>) -> Option<llvm::Linkage> {
218235
let def_id = match *self {
219236
TransItem::Fn(ref instance) => instance.def_id(),
220237
TransItem::Static(node_id) => tcx.hir.local_def_id(node_id),
238+
TransItem::GlobalAsm(..) => return None,
221239
};
222240

223241
let attributes = tcx.get_attrs(def_id);
@@ -249,6 +267,9 @@ impl<'a, 'tcx> TransItem<'tcx> {
249267
let instance = Instance::new(def_id, tcx.intern_substs(&[]));
250268
to_string_internal(tcx, "static ", instance)
251269
},
270+
TransItem::GlobalAsm(..) => {
271+
"global_asm".to_string()
272+
}
252273
};
253274

254275
fn to_string_internal<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
@@ -273,6 +294,9 @@ impl<'a, 'tcx> TransItem<'tcx> {
273294
TransItem::Static(id) => {
274295
format!("Static({:?})", id)
275296
}
297+
TransItem::GlobalAsm(id) => {
298+
format!("GlobalAsm({:?})", id)
299+
}
276300
}
277301
}
278302
}

0 commit comments

Comments
 (0)