@@ -209,7 +209,7 @@ TEST(LinkGraphTest, ContentAccessAndUpdate) {
209
209
}
210
210
211
211
TEST (LinkGraphTest, MakeExternal) {
212
- // Check that we can make a defined symbol external.
212
+ // Check that we can make defined and absolute symbols external.
213
213
LinkGraph G (" foo" , Triple (" x86_64-apple-darwin" ), 8 , support::little,
214
214
getGenericEdgeKindName);
215
215
auto &Sec = G.createSection (" __data" , MemProt::Read | MemProt::Write);
@@ -237,22 +237,111 @@ TEST(LinkGraphTest, MakeExternal) {
237
237
0U )
238
238
<< " Unexpected number of external symbols" ;
239
239
240
- // Make S1 external, confirm that the its flags are updated and that it is
241
- // moved from the defined symbols to the externals list.
240
+ // Add an absolute symbol.
241
+ auto &S2 = G.addAbsoluteSymbol (" S2" , orc::ExecutorAddr (0x2000 ), 0 ,
242
+ Linkage::Strong, Scope::Default, true );
243
+
244
+ EXPECT_TRUE (S2.isAbsolute ()) << " Symbol should be absolute" ;
245
+ EXPECT_EQ (
246
+ std::distance (G.absolute_symbols ().begin (), G.absolute_symbols ().end ()),
247
+ 1U )
248
+ << " Unexpected number of symbols" ;
249
+
250
+ // Make S1 and S2 external, confirm that the its flags are updated and that it
251
+ // is moved from the defined/absolute symbols lists to the externals list.
242
252
G.makeExternal (S1);
253
+ G.makeExternal (S2);
243
254
244
255
EXPECT_FALSE (S1.isDefined ()) << " Symbol should not be defined" ;
245
256
EXPECT_TRUE (S1.isExternal ()) << " Symbol should be external" ;
246
257
EXPECT_FALSE (S1.isAbsolute ()) << " Symbol should not be absolute" ;
258
+ EXPECT_FALSE (S2.isDefined ()) << " Symbol should not be defined" ;
259
+ EXPECT_TRUE (S2.isExternal ()) << " Symbol should be external" ;
260
+ EXPECT_FALSE (S2.isAbsolute ()) << " Symbol should not be absolute" ;
261
+
247
262
EXPECT_EQ (S1.getAddress (), orc::ExecutorAddr ())
248
263
<< " Unexpected symbol address" ;
264
+ EXPECT_EQ (S2.getAddress (), orc::ExecutorAddr ())
265
+ << " Unexpected symbol address" ;
249
266
250
267
EXPECT_EQ (
251
268
std::distance (G.defined_symbols ().begin (), G.defined_symbols ().end ()), 0U )
252
269
<< " Unexpected number of defined symbols" ;
270
+ EXPECT_EQ (
271
+ std::distance (G.external_symbols ().begin (), G.external_symbols ().end ()),
272
+ 2U )
273
+ << " Unexpected number of external symbols" ;
274
+ EXPECT_EQ (
275
+ std::distance (G.absolute_symbols ().begin (), G.absolute_symbols ().end ()),
276
+ 0U )
277
+ << " Unexpected number of external symbols" ;
278
+ }
279
+
280
+ TEST (LinkGraphTest, MakeAbsolute) {
281
+ // Check that we can make defined and external symbols absolute.
282
+ LinkGraph G (" foo" , Triple (" x86_64-apple-darwin" ), 8 , support::little,
283
+ getGenericEdgeKindName);
284
+ auto &Sec = G.createSection (" __data" , MemProt::Read | MemProt::Write);
285
+
286
+ // Create an initial block.
287
+ auto &B1 =
288
+ G.createContentBlock (Sec, BlockContent, orc::ExecutorAddr (0x1000 ), 8 , 0 );
289
+
290
+ // Add a symbol to the block.
291
+ auto &S1 = G.addDefinedSymbol (B1, 0 , " S1" , 4 , Linkage::Strong, Scope::Default,
292
+ false , false );
293
+
294
+ EXPECT_TRUE (S1.isDefined ()) << " Symbol should be defined" ;
295
+ EXPECT_FALSE (S1.isExternal ()) << " Symbol should not be external" ;
296
+ EXPECT_FALSE (S1.isAbsolute ()) << " Symbol should not be absolute" ;
297
+ EXPECT_TRUE (&S1.getBlock ()) << " Symbol should have a non-null block" ;
298
+ EXPECT_EQ (S1.getAddress (), orc::ExecutorAddr (0x1000 ))
299
+ << " Unexpected symbol address" ;
300
+
301
+ EXPECT_EQ (
302
+ std::distance (G.defined_symbols ().begin (), G.defined_symbols ().end ()), 1U )
303
+ << " Unexpected number of defined symbols" ;
304
+ EXPECT_EQ (
305
+ std::distance (G.external_symbols ().begin (), G.external_symbols ().end ()),
306
+ 0U )
307
+ << " Unexpected number of external symbols" ;
308
+
309
+ // Add an external symbol.
310
+ auto &S2 = G.addExternalSymbol (" S2" , 0 , Linkage::Strong);
311
+
312
+ EXPECT_TRUE (S2.isExternal ()) << " Symbol should be external" ;
253
313
EXPECT_EQ (
254
314
std::distance (G.external_symbols ().begin (), G.external_symbols ().end ()),
255
315
1U )
316
+ << " Unexpected number of symbols" ;
317
+
318
+ // Make S1 and S2 absolute, confirm that the its flags are updated and that it
319
+ // is moved from the defined/external symbols lists to the absolutes list.
320
+ orc::ExecutorAddr S1AbsAddr (0xA000 );
321
+ orc::ExecutorAddr S2AbsAddr (0xB000 );
322
+ G.makeAbsolute (S1, S1AbsAddr);
323
+ G.makeAbsolute (S2, S2AbsAddr);
324
+
325
+ EXPECT_FALSE (S1.isDefined ()) << " Symbol should not be defined" ;
326
+ EXPECT_FALSE (S1.isExternal ()) << " Symbol should not be external" ;
327
+ EXPECT_TRUE (S1.isAbsolute ()) << " Symbol should be absolute" ;
328
+ EXPECT_FALSE (S2.isDefined ()) << " Symbol should not be defined" ;
329
+ EXPECT_FALSE (S2.isExternal ()) << " Symbol should not be absolute" ;
330
+ EXPECT_TRUE (S2.isAbsolute ()) << " Symbol should be absolute" ;
331
+
332
+ EXPECT_EQ (S1.getAddress (), S1AbsAddr) << " Unexpected symbol address" ;
333
+ EXPECT_EQ (S2.getAddress (), S2AbsAddr) << " Unexpected symbol address" ;
334
+
335
+ EXPECT_EQ (
336
+ std::distance (G.defined_symbols ().begin (), G.defined_symbols ().end ()), 0U )
337
+ << " Unexpected number of defined symbols" ;
338
+ EXPECT_EQ (
339
+ std::distance (G.external_symbols ().begin (), G.external_symbols ().end ()),
340
+ 0U )
341
+ << " Unexpected number of external symbols" ;
342
+ EXPECT_EQ (
343
+ std::distance (G.absolute_symbols ().begin (), G.absolute_symbols ().end ()),
344
+ 2U )
256
345
<< " Unexpected number of external symbols" ;
257
346
}
258
347
0 commit comments