rustc_codegen_ssa: append blocks to functions w/o creating a builder.
This commit is contained in:
parent
402e9efc56
commit
0fcaf11455
7 changed files with 54 additions and 38 deletions
|
@ -118,24 +118,16 @@ macro_rules! builder_methods_for_value_instructions {
|
|||
}
|
||||
|
||||
impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
|
||||
fn new_block<'b>(cx: &'a CodegenCx<'ll, 'tcx>, llfn: &'ll Value, name: &'b str) -> Self {
|
||||
let mut bx = Builder::with_cx(cx);
|
||||
let llbb = unsafe {
|
||||
let name = SmallCStr::new(name);
|
||||
llvm::LLVMAppendBasicBlockInContext(cx.llcx, llfn, name.as_ptr())
|
||||
};
|
||||
bx.position_at_end(llbb);
|
||||
fn build(cx: &'a CodegenCx<'ll, 'tcx>, llbb: &'ll BasicBlock) -> Self {
|
||||
let bx = Builder::with_cx(cx);
|
||||
unsafe {
|
||||
llvm::LLVMPositionBuilderAtEnd(bx.llbuilder, llbb);
|
||||
}
|
||||
bx
|
||||
}
|
||||
|
||||
fn with_cx(cx: &'a CodegenCx<'ll, 'tcx>) -> Self {
|
||||
// Create a fresh builder from the crate context.
|
||||
let llbuilder = unsafe { llvm::LLVMCreateBuilderInContext(cx.llcx) };
|
||||
Builder { llbuilder, cx }
|
||||
}
|
||||
|
||||
fn build_sibling_block(&self, name: &str) -> Self {
|
||||
Builder::new_block(self.cx, self.llfn(), name)
|
||||
fn cx(&self) -> &CodegenCx<'ll, 'tcx> {
|
||||
self.cx
|
||||
}
|
||||
|
||||
fn llbb(&self) -> &'ll BasicBlock {
|
||||
|
@ -144,12 +136,22 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
|
|||
|
||||
fn set_span(&mut self, _span: Span) {}
|
||||
|
||||
fn position_at_end(&mut self, llbb: &'ll BasicBlock) {
|
||||
fn append_block(cx: &'a CodegenCx<'ll, 'tcx>, llfn: &'ll Value, name: &str) -> &'ll BasicBlock {
|
||||
unsafe {
|
||||
llvm::LLVMPositionBuilderAtEnd(self.llbuilder, llbb);
|
||||
let name = SmallCStr::new(name);
|
||||
llvm::LLVMAppendBasicBlockInContext(cx.llcx, llfn, name.as_ptr())
|
||||
}
|
||||
}
|
||||
|
||||
fn append_sibling_block(&mut self, name: &str) -> &'ll BasicBlock {
|
||||
Self::append_block(self.cx, self.llfn(), name)
|
||||
}
|
||||
|
||||
fn build_sibling_block(&mut self, name: &str) -> Self {
|
||||
let llbb = self.append_sibling_block(name);
|
||||
Self::build(self.cx, llbb)
|
||||
}
|
||||
|
||||
fn ret_void(&mut self) {
|
||||
unsafe {
|
||||
llvm::LLVMBuildRetVoid(self.llbuilder);
|
||||
|
@ -1144,10 +1146,6 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
|
|||
unsafe { llvm::LLVMBuildZExt(self.llbuilder, val, dest_ty, UNNAMED) }
|
||||
}
|
||||
|
||||
fn cx(&self) -> &CodegenCx<'ll, 'tcx> {
|
||||
self.cx
|
||||
}
|
||||
|
||||
fn do_not_inline(&mut self, llret: &'ll Value) {
|
||||
llvm::Attribute::NoInline.apply_callsite(llvm::AttributePlace::Function, llret);
|
||||
}
|
||||
|
@ -1161,6 +1159,12 @@ impl StaticBuilderMethods for Builder<'a, 'll, 'tcx> {
|
|||
}
|
||||
|
||||
impl Builder<'a, 'll, 'tcx> {
|
||||
fn with_cx(cx: &'a CodegenCx<'ll, 'tcx>) -> Self {
|
||||
// Create a fresh builder from the crate context.
|
||||
let llbuilder = unsafe { llvm::LLVMCreateBuilderInContext(cx.llcx) };
|
||||
Builder { llbuilder, cx }
|
||||
}
|
||||
|
||||
pub fn llfn(&self) -> &'ll Value {
|
||||
unsafe { llvm::LLVMGetBasicBlockParent(self.llbb()) }
|
||||
}
|
||||
|
|
|
@ -223,7 +223,8 @@ fn declare_unused_fn(cx: &CodegenCx<'ll, 'tcx>, def_id: &DefId) -> Instance<'tcx
|
|||
|
||||
fn codegen_unused_fn_and_counter(cx: &CodegenCx<'ll, 'tcx>, instance: Instance<'tcx>) {
|
||||
let llfn = cx.get_fn(instance);
|
||||
let mut bx = Builder::new_block(cx, llfn, "unused_function");
|
||||
let llbb = Builder::append_block(cx, llfn, "unused_function");
|
||||
let mut bx = Builder::build(cx, llbb);
|
||||
let fn_name = bx.get_pgo_func_name_var(instance);
|
||||
let hash = bx.const_u64(0);
|
||||
let num_counters = bx.const_u32(1);
|
||||
|
|
|
@ -678,7 +678,8 @@ fn gen_fn<'ll, 'tcx>(
|
|||
cx.apply_target_cpu_attr(llfn);
|
||||
// FIXME(eddyb) find a nicer way to do this.
|
||||
unsafe { llvm::LLVMRustSetLinkage(llfn, llvm::Linkage::InternalLinkage) };
|
||||
let bx = Builder::new_block(cx, llfn, "entry-block");
|
||||
let llbb = Builder::append_block(cx, llfn, "entry-block");
|
||||
let bx = Builder::build(cx, llbb);
|
||||
codegen(bx);
|
||||
llfn
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue