@@ -3397,6 +3397,92 @@ TEST_F(DIExpressionTest, Fold) {
3397
3397
EXPECT_EQ (E, ResExpr);
3398
3398
}
3399
3399
3400
+ TEST_F (DIExpressionTest, Append) {
3401
+ // Test appending a {dwarf::DW_OP_constu, <const>, DW_OP_plus} to a DW_OP_plus expression
3402
+ SmallVector<uint64_t , 8 > Ops = {dwarf::DW_OP_LLVM_arg, 0 ,
3403
+ dwarf::DW_OP_constu, 2 , dwarf::DW_OP_plus};
3404
+ auto *Expr = DIExpression::get (Context, Ops);
3405
+ SmallVector<uint64_t , 8 > AppendOps = {dwarf::DW_OP_constu, 3 ,
3406
+ dwarf::DW_OP_plus};
3407
+ auto *AppendExpr = DIExpression::append (Expr, AppendOps);
3408
+ SmallVector<uint64_t , 8 > OpsRes = {
3409
+ dwarf::DW_OP_LLVM_arg, 0 , dwarf::DW_OP_constu, 5 , dwarf::DW_OP_plus};
3410
+ auto *ResExpr = DIExpression::get (Context, OpsRes);
3411
+ EXPECT_EQ (ResExpr, AppendExpr);
3412
+
3413
+ // Test appending a {dwarf::DW_OP_plus_uconst, <const>} to a DW_OP_plus
3414
+ // expression uint64_t PlusUConstOps[] = {dwarf::DW_OP_plus_uconst, 3};
3415
+ AppendOps.clear ();
3416
+ AppendOps.push_back (dwarf::DW_OP_plus_uconst);
3417
+ AppendOps.push_back (3 );
3418
+ AppendExpr = DIExpression::append (Expr, AppendOps);
3419
+ OpsRes.clear ();
3420
+ OpsRes.push_back (dwarf::DW_OP_LLVM_arg);
3421
+ OpsRes.push_back (0 );
3422
+ OpsRes.push_back (dwarf::DW_OP_plus_uconst);
3423
+ OpsRes.push_back (5 );
3424
+ ResExpr = DIExpression::get (Context, OpsRes);
3425
+ EXPECT_EQ (ResExpr, AppendExpr);
3426
+
3427
+ // Test appending a {dwarf::DW_OP_constu, 0, DW_OP_plus} to an expression
3428
+ AppendOps[0 ] = dwarf::DW_OP_constu;
3429
+ AppendOps[1 ] = 0 ;
3430
+ AppendOps.push_back (dwarf::DW_OP_plus);
3431
+ AppendExpr = DIExpression::append (Expr, AppendOps);
3432
+ OpsRes[2 ] = dwarf::DW_OP_constu;
3433
+ OpsRes[3 ] = Ops[3 ];
3434
+ OpsRes.push_back (dwarf::DW_OP_plus);
3435
+ ResExpr = DIExpression::get (Context, OpsRes);
3436
+ EXPECT_EQ (ResExpr, AppendExpr);
3437
+
3438
+ // Test appending a {dwarf::DW_OP_constu, 0, DW_OP_minus} to an expression
3439
+ AppendOps[2 ] = dwarf::DW_OP_minus;
3440
+ AppendExpr = DIExpression::append (Expr, AppendOps);
3441
+ OpsRes[3 ] = Ops[3 ];
3442
+ ResExpr = DIExpression::get (Context, OpsRes);
3443
+ EXPECT_EQ (ResExpr, AppendExpr);
3444
+
3445
+ // Test appending a {dwarf::DW_OP_constu, 0, DW_OP_shl} to an expression
3446
+ AppendOps[2 ] = dwarf::DW_OP_shl;
3447
+ AppendExpr = DIExpression::append (Expr, AppendOps);
3448
+ OpsRes[3 ] = Ops[3 ];
3449
+ ResExpr = DIExpression::get (Context, OpsRes);
3450
+ EXPECT_EQ (ResExpr, AppendExpr);
3451
+
3452
+ // Test appending a {dwarf::DW_OP_constu, 0, DW_OP_shr} to an expression
3453
+ AppendOps[2 ] = dwarf::DW_OP_shr;
3454
+ AppendExpr = DIExpression::append (Expr, AppendOps);
3455
+ OpsRes[3 ] = Ops[3 ];
3456
+ ResExpr = DIExpression::get (Context, OpsRes);
3457
+ EXPECT_EQ (ResExpr, AppendExpr);
3458
+
3459
+ // Test appending a {dwarf::DW_OP_constu, <const>, DW_OP_mul} to a DW_OP_mul expression
3460
+ Ops[4 ] = dwarf::DW_OP_mul;
3461
+ Expr = DIExpression::get (Context, Ops);
3462
+ AppendOps[1 ] = 3 ;
3463
+ AppendOps[2 ] = dwarf::DW_OP_mul;
3464
+ AppendExpr = DIExpression::append (Expr, AppendOps);
3465
+ OpsRes[3 ] = 6 ;
3466
+ OpsRes[4 ] = dwarf::DW_OP_mul;
3467
+ ResExpr = DIExpression::get (Context, OpsRes);
3468
+ EXPECT_EQ (ResExpr, AppendExpr);
3469
+
3470
+ // Test appending a {dwarf::DW_OP_constu, 1, DW_OP_mul} to an expression
3471
+ AppendOps[1 ] = 1 ;
3472
+ AppendExpr = DIExpression::append (Expr, AppendOps);
3473
+ OpsRes[3 ] = Ops[3 ];
3474
+ ResExpr = DIExpression::get (Context, OpsRes);
3475
+ EXPECT_EQ (ResExpr, AppendExpr);
3476
+
3477
+ // Test appending a {dwarf::DW_OP_constu, 1, DW_OP_div} to an expression
3478
+ AppendOps[1 ] = 1 ;
3479
+ AppendOps[2 ] = dwarf::DW_OP_div;
3480
+ AppendExpr = DIExpression::append (Expr, AppendOps);
3481
+ OpsRes[3 ] = Ops[3 ];
3482
+ ResExpr = DIExpression::get (Context, OpsRes);
3483
+ EXPECT_EQ (ResExpr, AppendExpr);
3484
+ }
3485
+
3400
3486
TEST_F (DIExpressionTest, isValid) {
3401
3487
#define EXPECT_VALID (...) \
3402
3488
do { \
0 commit comments