Global
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	
This commit is contained in:
		
							parent
							
								
									6c244c1243
								
							
						
					
					
						commit
						7b10a836f8
					
				@ -512,6 +512,7 @@ pub const Value = struct {
 | 
				
			|||||||
        variable_reference: *Variable,
 | 
					        variable_reference: *Variable,
 | 
				
			||||||
        local,
 | 
					        local,
 | 
				
			||||||
        argument,
 | 
					        argument,
 | 
				
			||||||
 | 
					        global,
 | 
				
			||||||
        intrinsic: Intrinsic,
 | 
					        intrinsic: Intrinsic,
 | 
				
			||||||
        dereference: *Value,
 | 
					        dereference: *Value,
 | 
				
			||||||
        call: Call,
 | 
					        call: Call,
 | 
				
			||||||
@ -959,7 +960,10 @@ pub const Module = struct {
 | 
				
			|||||||
                .call_no_builtins = false,
 | 
					                .call_no_builtins = false,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                // DEFINITION-SITE ATTRIBUTES
 | 
					                // DEFINITION-SITE ATTRIBUTES
 | 
				
			||||||
                .definition_frame_pointer_kind = .none,
 | 
					                .definition_frame_pointer_kind = switch (module.has_debug_info) {
 | 
				
			||||||
 | 
					                    true => .all,
 | 
				
			||||||
 | 
					                    false => .none,
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
                .definition_less_precise_fpmad = false,
 | 
					                .definition_less_precise_fpmad = false,
 | 
				
			||||||
                .definition_null_pointer_is_valid = false,
 | 
					                .definition_null_pointer_is_valid = false,
 | 
				
			||||||
                .definition_no_trapping_fp_math = false,
 | 
					                .definition_no_trapping_fp_math = false,
 | 
				
			||||||
@ -2267,6 +2271,30 @@ pub const Module = struct {
 | 
				
			|||||||
                    module.offset -= global_string.len;
 | 
					                    module.offset -= global_string.len;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (!global_keyword) {
 | 
				
			||||||
 | 
					                const v = module.parse_value(.{});
 | 
				
			||||||
 | 
					                module.skip_space();
 | 
				
			||||||
 | 
					                module.expect_character(';');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                const global = module.globals.add();
 | 
				
			||||||
 | 
					                const global_storage = module.values.add();
 | 
				
			||||||
 | 
					                global_storage.* = .{
 | 
				
			||||||
 | 
					                    .bb = .global,
 | 
				
			||||||
 | 
					                };
 | 
				
			||||||
 | 
					                global.* = .{
 | 
				
			||||||
 | 
					                    .variable = .{
 | 
				
			||||||
 | 
					                        .storage = global_storage,
 | 
				
			||||||
 | 
					                        .initial_value = v,
 | 
				
			||||||
 | 
					                        .type = global_type,
 | 
				
			||||||
 | 
					                        .scope = &module.scope,
 | 
				
			||||||
 | 
					                        .name = global_name,
 | 
				
			||||||
 | 
					                        .line = global_line,
 | 
				
			||||||
 | 
					                        .column = global_column,
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    .linkage = .internal,
 | 
				
			||||||
 | 
					                };
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -2761,6 +2789,29 @@ pub const Module = struct {
 | 
				
			|||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
 | 
					                .global => {
 | 
				
			||||||
 | 
					                    module.analyze(null, global.variable.initial_value, .{ .type = global.variable.type });
 | 
				
			||||||
 | 
					                    const global_variable = module.llvm.module.create_global_variable(.{
 | 
				
			||||||
 | 
					                        .linkage = switch (global.linkage) {
 | 
				
			||||||
 | 
					                            .internal => .InternalLinkage,
 | 
				
			||||||
 | 
					                            .external => .ExternalLinkage,
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        .name = global.variable.name,
 | 
				
			||||||
 | 
					                        .initial_value = global.variable.initial_value.llvm.?.to_constant(),
 | 
				
			||||||
 | 
					                        .type = global.variable.type.?.resolve(module).handle,
 | 
				
			||||||
 | 
					                    });
 | 
				
			||||||
 | 
					                    global_variable.to_value().set_alignment(global.variable.type.?.get_byte_alignment());
 | 
				
			||||||
 | 
					                    global.variable.storage.?.llvm = global_variable.to_value();
 | 
				
			||||||
 | 
					                    global.variable.storage.?.type = module.get_pointer_type(.{ .type = global.variable.type.? });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (module.has_debug_info) {
 | 
				
			||||||
 | 
					                        const linkage_name = global.variable.name;
 | 
				
			||||||
 | 
					                        const local_to_unit = global.linkage == .internal;
 | 
				
			||||||
 | 
					                        const alignment = 0; // TODO
 | 
				
			||||||
 | 
					                        const global_variable_expression = module.llvm.di_builder.create_global_variable(module.scope.llvm.?, global.variable.name, linkage_name, module.llvm.file, global.variable.line, global.variable.type.?.llvm.debug.?, local_to_unit, module.llvm.di_builder.null_expression(), alignment);
 | 
				
			||||||
 | 
					                        global_variable.add_debug_info(global_variable_expression);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
                else => @trap(),
 | 
					                else => @trap(),
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -2828,12 +2879,12 @@ pub const Module = struct {
 | 
				
			|||||||
        type: ?*Type = null,
 | 
					        type: ?*Type = null,
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub fn analyze(module: *Module, function: *Global, value: *Value, analysis: ValueAnalysis) void {
 | 
					    pub fn analyze(module: *Module, function: ?*Global, value: *Value, analysis: ValueAnalysis) void {
 | 
				
			||||||
        module.analyze_value_type(function, value, analysis);
 | 
					        module.analyze_value_type(function, value, analysis);
 | 
				
			||||||
        module.emit_value(function, value);
 | 
					        module.emit_value(function, value);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub fn emit_value(module: *Module, function: *Global, value: *Value) void {
 | 
					    pub fn emit_value(module: *Module, function: ?*Global, value: *Value) void {
 | 
				
			||||||
        const value_type = value.type orelse unreachable;
 | 
					        const value_type = value.type orelse unreachable;
 | 
				
			||||||
        assert(value.llvm == null);
 | 
					        assert(value.llvm == null);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -3345,7 +3396,7 @@ pub const Module = struct {
 | 
				
			|||||||
        value.llvm = llvm_value;
 | 
					        value.llvm = llvm_value;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub fn analyze_value_type(module: *Module, function: *Global, value: *Value, analysis: ValueAnalysis) void {
 | 
					    pub fn analyze_value_type(module: *Module, function: ?*Global, value: *Value, analysis: ValueAnalysis) void {
 | 
				
			||||||
        assert(value.type == null);
 | 
					        assert(value.type == null);
 | 
				
			||||||
        assert(value.llvm == null);
 | 
					        assert(value.llvm == null);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -197,4 +197,6 @@ const names = &[_][]const u8{
 | 
				
			|||||||
    "pointer",
 | 
					    "pointer",
 | 
				
			||||||
    "pointer_cast",
 | 
					    "pointer_cast",
 | 
				
			||||||
    "u1_return",
 | 
					    "u1_return",
 | 
				
			||||||
 | 
					    "local_type_inference",
 | 
				
			||||||
 | 
					    "global",
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user