@@ -79,11 +79,61 @@ pub fn write_compressed_metadata<'tcx>(
79
79
pub fn write_idata_sections < ' tcx > (
80
80
_tcx : TyCtxt < ' tcx > ,
81
81
raw_dylibs : & [ RawDylibImports ] ,
82
- _llvm_module : & mut ModuleLlvm ,
82
+ llvm_module : & mut ModuleLlvm ,
83
83
) {
84
+ let ( idata_llctx, idata_llmod) = ( & * llvm_module. llcx , llvm_module. llmod ( ) ) ;
85
+
86
+
87
+ let idata_7 = SmallCStr :: new ( ".idata$7" ) ;
88
+ let idata_6 = SmallCStr :: new ( ".idata$6" ) ;
89
+
84
90
for raw_dylib in raw_dylibs {
85
91
debug ! ( "linking raw dylib - {:?}" , raw_dylib) ;
86
- //TODO: emit.
92
+
93
+ let name = CString :: new ( & * raw_dylib. name . as_str ( ) ) . unwrap ( ) ;
94
+ let llname = common:: bytes_in_context ( idata_llctx, name. as_bytes ( ) ) ;
95
+
96
+ let buf = CString :: new ( "dll_name" ) . unwrap ( ) ;
97
+ unsafe {
98
+ let llglobal = llvm:: LLVMAddGlobal ( idata_llmod, common:: val_ty ( llname) , buf. as_ptr ( ) ) ;
99
+
100
+ llvm:: LLVMSetInitializer ( llglobal, llname) ;
101
+ llvm:: LLVMSetGlobalConstant ( & llglobal, 1 ) ;
102
+ llvm:: LLVMRustSetLinkage ( llglobal, llvm:: Linkage :: PrivateLinkage ) ;
103
+ llvm:: LLVMSetSection ( llglobal, idata_7. as_ptr ( ) ) ;
104
+
105
+ for item in & raw_dylib. items {
106
+ match item {
107
+ RawDylibImportName :: Name ( s) => {
108
+ let mut buf = vec ! [ 0 , 0 ] ;
109
+ buf. extend ( s. as_str ( ) . as_bytes ( ) ) ;
110
+
111
+ if buf. len ( ) % 2 == 1 {
112
+ buf. push ( 0 ) ;
113
+ }
114
+
115
+ let llname = common:: bytes_in_context ( idata_llctx, & buf) ;
116
+
117
+ let global_name = format ! ( "import.{}.fn.{}" , raw_dylib. name, s) ;
118
+ let global_name = CString :: new ( global_name. as_str ( ) ) . unwrap ( ) ;
119
+
120
+ let llglobal = llvm:: LLVMAddGlobal (
121
+ idata_llmod,
122
+ common:: val_ty ( llname) ,
123
+ global_name. as_ptr ( )
124
+ ) ;
125
+
126
+ llvm:: LLVMSetInitializer ( llglobal, llname) ;
127
+ llvm:: LLVMSetGlobalConstant ( & llglobal, 1 ) ;
128
+ llvm:: LLVMRustSetLinkage ( llglobal, llvm:: Linkage :: PrivateLinkage ) ;
129
+ llvm:: LLVMSetSection ( llglobal, idata_6. as_ptr ( ) ) ;
130
+ } ,
131
+ _ => { } ,
132
+ }
133
+ }
134
+ }
135
+
136
+
87
137
}
88
138
89
139
}
0 commit comments