11use crate :: abi:: Endian ;
2- use crate :: spec:: { Cc , cvs, LinkerFlavor , Lld , PanicStrategy , TargetOptions } ;
2+ use crate :: spec:: { Cc , cvs, LinkerFlavor , Lld , PanicStrategy , Target , TargetOptions } ;
33
4- pub fn opts ( ) -> TargetOptions {
5- let linker_script = r"
4+ const V0_LINKER_SCRIPT : & str = r"
65PHDRS
76{
87 text PT_LOAD ;
@@ -28,11 +27,74 @@ SECTIONS
2827 }
2928}
3029" ;
30+
31+ const V3_LINKER_SCRIPT : & str = r"
32+ SECTIONS
33+ {
34+ .rodata 0x000000000 : SUBALIGN(8) {
35+ BYTE(0);
36+ *(.rodata*)
37+ *(.data.rel.ro*)
38+ . = ALIGN(8);
39+ } :rodata
40+ .text 0x100000000 : {
41+ *(.text*)
42+ } :text
43+ /DISCARD/ : {
44+ *(.comment*)
45+ *(.eh_frame*)
46+ *(*hash*)
47+ *(.bss*)
48+ *(.data*)
49+ *(.rel.dyn*)
50+ *(.dynamic)
51+ *(.dynsym)
52+ *(.dynstr)
53+ }
54+ }
55+
56+ PHDRS
57+ {
58+ rodata PT_LOAD FLAGS(4);
59+ text PT_LOAD FLAGS(1);
60+ other PT_NULL FLAGS(0);
61+ }
62+ " ;
63+
64+ pub fn opts ( version : & ' static str ) -> TargetOptions {
65+ let mut linker_args: Vec < & str > = vec ! [
66+ "--threads=1" , "-z" , "notext"
67+ ] ;
68+
69+ if version != "v3" {
70+ linker_args. push ( "-z" ) ;
71+ linker_args. push ( "max-page-size=4096" ) ;
72+ }
73+
3174 let pre_link_args = TargetOptions :: link_args (
3275 LinkerFlavor :: Gnu ( Cc :: No , Lld :: No ) ,
33- & [ "--threads=1" , "-z" , "notext" ] ,
76+ linker_args . as_slice ( ) ,
3477 ) ;
3578
79+ let linker_script = if version == "v3" {
80+ V3_LINKER_SCRIPT
81+ } else {
82+ V0_LINKER_SCRIPT
83+ } ;
84+ let cpu = if version == "v0" {
85+ "generic"
86+ } else {
87+ version
88+ } ;
89+
90+ let features = if version == "v3" {
91+ "+static-syscalls"
92+ } else if version == "v0" {
93+ "+store-imm,+jmp-ext"
94+ } else {
95+ ""
96+ } ;
97+
3698 TargetOptions {
3799 allow_asm : true ,
38100 c_int_width : "64" . into ( ) ,
@@ -44,7 +106,6 @@ SECTIONS
44106 endian : Endian :: Little ,
45107 env : "" . into ( ) ,
46108 executables : true ,
47- features : "+solana" . into ( ) ,
48109 families : cvs ! [ "solana" ] ,
49110 link_script : Some ( linker_script. into ( ) ) ,
50111 linker : Some ( "rust-lld" . into ( ) ) ,
@@ -61,6 +122,18 @@ SECTIONS
61122 singlethread : true ,
62123 vendor : "solana" . into ( ) ,
63124 c_enum_min_bits : Some ( 32 ) ,
125+ cpu : cpu. into ( ) ,
126+ features : features. into ( ) ,
64127 .. Default :: default ( )
65128 }
66129}
130+
131+ pub fn sbf_target ( version : & ' static str ) -> Target {
132+ Target {
133+ llvm_target : "sbf" . into ( ) ,
134+ pointer_width : 64 ,
135+ arch : "sbf" . into ( ) ,
136+ data_layout : "e-m:e-p:64:64-i64:64-n32:64-S128" . into ( ) ,
137+ options : opts ( version) ,
138+ }
139+ }
0 commit comments