1 // Copyright (c) 2010, Google Inc. 2 // All rights reserved. 3 // 4 // Redistribution and use in source and binary forms, with or without 5 // modification, are permitted provided that the following conditions are 6 // met: 7 // 8 // * Redistributions of source code must retain the above copyright 9 // notice, this list of conditions and the following disclaimer. 10 // * Redistributions in binary form must reproduce the above 11 // copyright notice, this list of conditions and the following disclaimer 12 // in the documentation and/or other materials provided with the 13 // distribution. 14 // * Neither the name of Google Inc. nor the names of its 15 // contributors may be used to endorse or promote products derived from 16 // this software without specific prior written permission. 17 // 18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 30 // Original author: Jim Blandy <jimb (at) mozilla.com> <jimb (at) red-bean.com> 31 32 // test_assembler_unittest.cc: Unit tests for google_breakpad::TestAssembler. 33 34 #include <string> 35 #include <string.h> 36 37 #include "breakpad_googletest_includes.h" 38 #include "common/test_assembler.h" 39 #include "common/using_std_string.h" 40 41 using google_breakpad::test_assembler::Label; 42 using google_breakpad::test_assembler::Section; 43 using google_breakpad::test_assembler::kBigEndian; 44 using google_breakpad::test_assembler::kLittleEndian; 45 using testing::Test; 46 47 TEST(ConstructLabel, Simple) { 48 Label l; 49 } 50 51 TEST(ConstructLabel, Undefined) { 52 Label l; 53 EXPECT_FALSE(l.IsKnownConstant()); 54 } 55 56 TEST(ConstructLabelDeathTest, Undefined) { 57 Label l; 58 ASSERT_DEATH(l.Value(), "IsKnownConstant\\(&v\\)"); 59 } 60 61 TEST(ConstructLabel, Constant) { 62 Label l(0x060b9f974eaf301eULL); 63 uint64_t v; 64 EXPECT_TRUE(l.IsKnownConstant(&v)); 65 EXPECT_EQ(v, 0x060b9f974eaf301eULL); 66 EXPECT_EQ(l.Value(), 0x060b9f974eaf301eULL); 67 } 68 69 TEST(ConstructLabel, Copy) { 70 Label l; 71 Label m(l); 72 uint64_t v; 73 EXPECT_TRUE(l.IsKnownOffsetFrom(m, &v)); 74 EXPECT_EQ(0U, v); 75 } 76 77 // The left-hand-side of a label assignment can be either 78 // unconstrained, related, or known. The right-hand-side can be any of 79 // those, or an integer. 80 TEST(Assignment, UnconstrainedToUnconstrained) { 81 Label l, m; 82 l = m; 83 EXPECT_EQ(0U, l-m); 84 EXPECT_TRUE(l.IsKnownOffsetFrom(m)); 85 uint64_t d; 86 EXPECT_TRUE(l.IsKnownOffsetFrom(m, &d)); 87 EXPECT_EQ(0U, d); 88 EXPECT_FALSE(l.IsKnownConstant()); 89 } 90 91 TEST(Assignment, UnconstrainedToRelated) { 92 Label l, m, n; 93 l = n; 94 l = m; 95 EXPECT_EQ(0U, l-m); 96 EXPECT_TRUE(l.IsKnownOffsetFrom(m)); 97 uint64_t d; 98 EXPECT_TRUE(l.IsKnownOffsetFrom(m, &d)); 99 EXPECT_EQ(0U, d); 100 EXPECT_FALSE(l.IsKnownConstant()); 101 } 102 103 TEST(Assignment, UnconstrainedToKnown) { 104 Label l, m; 105 l = 0x8fd16e55b20a39c1ULL; 106 l = m; 107 EXPECT_EQ(0U, l-m); 108 EXPECT_TRUE(l.IsKnownOffsetFrom(m)); 109 uint64_t d; 110 EXPECT_TRUE(l.IsKnownOffsetFrom(m, &d)); 111 EXPECT_EQ(0U, d); 112 EXPECT_TRUE(m.IsKnownConstant()); 113 EXPECT_EQ(0x8fd16e55b20a39c1ULL, m.Value()); 114 } 115 116 TEST(Assignment, RelatedToUnconstrained) { 117 Label l, m, n; 118 m = n; 119 l = m; 120 EXPECT_EQ(0U, l-n); 121 EXPECT_TRUE(l.IsKnownOffsetFrom(n)); 122 uint64_t d; 123 EXPECT_TRUE(l.IsKnownOffsetFrom(n, &d)); 124 EXPECT_EQ(0U, d); 125 EXPECT_FALSE(l.IsKnownConstant()); 126 } 127 128 TEST(Assignment, RelatedToRelated) { 129 Label l, m, n, o; 130 l = n; 131 m = o; 132 l = m; 133 EXPECT_EQ(0U, n-o); 134 EXPECT_TRUE(n.IsKnownOffsetFrom(o)); 135 uint64_t d; 136 EXPECT_TRUE(n.IsKnownOffsetFrom(o, &d)); 137 EXPECT_EQ(0U, d); 138 EXPECT_FALSE(l.IsKnownConstant()); 139 } 140 141 TEST(Assignment, RelatedToKnown) { 142 Label l, m, n; 143 m = n; 144 l = 0xd2011f8c82ad56f2ULL; 145 l = m; 146 EXPECT_TRUE(l.IsKnownConstant()); 147 EXPECT_EQ(0xd2011f8c82ad56f2ULL, l.Value()); 148 EXPECT_TRUE(m.IsKnownConstant()); 149 EXPECT_EQ(0xd2011f8c82ad56f2ULL, m.Value()); 150 EXPECT_TRUE(n.IsKnownConstant()); 151 EXPECT_EQ(0xd2011f8c82ad56f2ULL, n.Value()); 152 } 153 154 TEST(Assignment, KnownToUnconstrained) { 155 Label l, m; 156 m = 0x50b024c0d6073887ULL; 157 l = m; 158 EXPECT_TRUE(l.IsKnownConstant()); 159 EXPECT_EQ(0x50b024c0d6073887ULL, l.Value()); 160 EXPECT_TRUE(m.IsKnownConstant()); 161 EXPECT_EQ(0x50b024c0d6073887ULL, m.Value()); 162 } 163 164 TEST(Assignment, KnownToRelated) { 165 Label l, m, n; 166 l = n; 167 m = 0x5348883655c727e5ULL; 168 l = m; 169 EXPECT_TRUE(l.IsKnownConstant()); 170 EXPECT_EQ(0x5348883655c727e5ULL, l.Value()); 171 EXPECT_TRUE(m.IsKnownConstant()); 172 EXPECT_EQ(0x5348883655c727e5ULL, m.Value()); 173 EXPECT_TRUE(n.IsKnownConstant()); 174 EXPECT_EQ(0x5348883655c727e5ULL, n.Value()); 175 } 176 177 TEST(Assignment, KnownToKnown) { 178 Label l, m; 179 l = 0x36c209c20987564eULL; 180 m = 0x36c209c20987564eULL; 181 l = m; 182 EXPECT_TRUE(l.IsKnownConstant()); 183 EXPECT_EQ(0x36c209c20987564eULL, l.Value()); 184 EXPECT_TRUE(m.IsKnownConstant()); 185 EXPECT_EQ(0x36c209c20987564eULL, m.Value()); 186 } 187 188 TEST(Assignment, ConstantToUnconstrained) { 189 Label l; 190 l = 0xc02495f4d7f5a957ULL; 191 EXPECT_TRUE(l.IsKnownConstant()); 192 EXPECT_EQ(0xc02495f4d7f5a957ULL, l.Value()); 193 } 194 195 TEST(Assignment, ConstantToRelated) { 196 Label l, m; 197 l = m; 198 l = 0x4577901cf275488dULL; 199 EXPECT_TRUE(l.IsKnownConstant()); 200 EXPECT_EQ(0x4577901cf275488dULL, l.Value()); 201 EXPECT_TRUE(m.IsKnownConstant()); 202 EXPECT_EQ(0x4577901cf275488dULL, m.Value()); 203 } 204 205 TEST(Assignment, ConstantToKnown) { 206 Label l; 207 l = 0xec0b9c369b7e8ea7ULL; 208 l = 0xec0b9c369b7e8ea7ULL; 209 EXPECT_TRUE(l.IsKnownConstant()); 210 EXPECT_EQ(0xec0b9c369b7e8ea7ULL, l.Value()); 211 } 212 213 TEST(AssignmentDeathTest, Self) { 214 Label l; 215 ASSERT_DEATH(l = l, "binding != this"); 216 } 217 218 TEST(AssignmentDeathTest, IndirectCycle) { 219 Label l, m, n; 220 l = m; 221 m = n; 222 ASSERT_DEATH(n = l, "binding != this"); 223 } 224 225 TEST(AssignmentDeathTest, Cycle) { 226 Label l, m, n, o; 227 l = m; 228 m = n; 229 o = n; 230 ASSERT_DEATH(o = l, "binding != this"); 231 } 232 233 TEST(Addition, LabelConstant) { 234 Label l, m; 235 m = l + 0x5248d93e8bbe9497ULL; 236 EXPECT_TRUE(m.IsKnownOffsetFrom(l)); 237 uint64_t d; 238 EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d)); 239 EXPECT_EQ(0x5248d93e8bbe9497ULL, d); 240 EXPECT_FALSE(m.IsKnownConstant()); 241 } 242 243 TEST(Addition, ConstantLabel) { 244 Label l, m; 245 m = 0xf51e94e00d6e3c84ULL + l; 246 EXPECT_TRUE(m.IsKnownOffsetFrom(l)); 247 uint64_t d; 248 EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d)); 249 EXPECT_EQ(0xf51e94e00d6e3c84ULL, d); 250 EXPECT_FALSE(m.IsKnownConstant()); 251 } 252 253 TEST(Addition, KnownLabelConstant) { 254 Label l, m; 255 l = 0x16286307042ce0d8ULL; 256 m = l + 0x3fdddd91306719d7ULL; 257 EXPECT_TRUE(m.IsKnownOffsetFrom(l)); 258 uint64_t d; 259 EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d)); 260 EXPECT_EQ(0x3fdddd91306719d7ULL, d); 261 EXPECT_TRUE(m.IsKnownConstant()); 262 EXPECT_EQ(0x16286307042ce0d8ULL + 0x3fdddd91306719d7ULL, m.Value()); 263 } 264 265 TEST(Addition, ConstantKnownLabel) { 266 Label l, m; 267 l = 0x50f62d0cdd1031deULL; 268 m = 0x1b13462d8577c538ULL + l; 269 EXPECT_TRUE(m.IsKnownOffsetFrom(l)); 270 uint64_t d; 271 EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d)); 272 EXPECT_EQ(0x1b13462d8577c538ULL, d); 273 EXPECT_TRUE(m.IsKnownConstant()); 274 EXPECT_EQ(0x50f62d0cdd1031deULL + 0x1b13462d8577c538ULL, m.Value()); 275 } 276 277 TEST(Subtraction, LabelConstant) { 278 Label l, m; 279 m = l - 0x0620884d21d3138eULL; 280 EXPECT_TRUE(m.IsKnownOffsetFrom(l)); 281 uint64_t d; 282 EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d)); 283 EXPECT_EQ(-0x0620884d21d3138eULL, d); 284 EXPECT_FALSE(m.IsKnownConstant()); 285 } 286 287 TEST(Subtraction, KnownLabelConstant) { 288 Label l, m; 289 l = 0x6237fbaf9ef7929eULL; 290 m = l - 0x317730995d2ab6eeULL; 291 EXPECT_TRUE(m.IsKnownOffsetFrom(l)); 292 uint64_t d; 293 EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d)); 294 EXPECT_EQ(-0x317730995d2ab6eeULL, d); 295 EXPECT_TRUE(m.IsKnownConstant()); 296 EXPECT_EQ(0x6237fbaf9ef7929eULL - 0x317730995d2ab6eeULL, m.Value()); 297 } 298 299 TEST(SubtractionDeathTest, LabelLabel) { 300 Label l, m; 301 ASSERT_DEATH(l - m, "IsKnownOffsetFrom\\(label, &offset\\)"); 302 } 303 304 TEST(Subtraction, LabelLabel) { 305 Label l, m; 306 l = m + 0x7fa77ec63e28a17aULL; 307 EXPECT_EQ(0x7fa77ec63e28a17aULL, l - m); 308 EXPECT_EQ(-0x7fa77ec63e28a17aULL, m - l); 309 } 310 311 TEST(IsKnownConstant, Undefined) { 312 Label l; 313 EXPECT_FALSE(l.IsKnownConstant()); 314 } 315 316 TEST(IsKnownConstant, RelatedLabel) { 317 Label l, m; 318 l = m; 319 EXPECT_FALSE(l.IsKnownConstant()); 320 EXPECT_FALSE(m.IsKnownConstant()); 321 } 322 323 TEST(IsKnownConstant, Constant) { 324 Label l; 325 l = 0xf374b1bdd6a22576ULL; 326 EXPECT_TRUE(l.IsKnownConstant()); 327 } 328 329 TEST(IsKnownOffsetFrom, Unrelated) { 330 Label l, m; 331 EXPECT_FALSE(l.IsKnownOffsetFrom(m)); 332 } 333 334 TEST(IsKnownOffsetFrom, Related) { 335 Label l, m; 336 l = m; 337 EXPECT_TRUE(l.IsKnownOffsetFrom(m)); 338 } 339 340 // Test the construction of chains of related labels, and the 341 // propagation of values through them. 342 // 343 // Although the relations between labels are supposed to behave 344 // symmetrically --- that is, 'a = b' should put a and b in 345 // indistinguishable states --- there's a distinction made internally 346 // between the target (a) and the source (b). 347 // 348 // So there are five test axes to cover: 349 // 350 // - Do we construct the chain with assignment ("Assign") or with constructors 351 // ("Construct")? 352 // 353 // - Do we set the value of the label at the start of the chain 354 // ("Start") or the label at the end ("End")? 355 // 356 // - Are we testing the propagation of a relationship between variable 357 // values ("Relation"), or the propagation of a known constant value 358 // ("Value")? 359 // 360 // - Do we set the value before building the chain ("Before") or after 361 // the chain has been built ("After")? 362 // 363 // - Do we add new relationships to the end of the existing chain 364 // ("Forward") or to the beginning ("Backward")? 365 // 366 // Of course, "Construct" and "Backward" can't be combined, which 367 // eliminates eight combinations, and "Construct", "End", and "Before" 368 // can't be combined, which eliminates two more, so there are are 22 369 // combinations, not 32. 370 371 TEST(LabelChain, AssignStartRelationBeforeForward) { 372 Label a, b, c, d; 373 Label x; 374 a = x; 375 b = a + 0x1; 376 c = b + 0x10; 377 d = c + 0x100; 378 EXPECT_EQ(0x111U, d-x); 379 EXPECT_EQ(0x11U, c-x); 380 EXPECT_EQ(0x1U, b-x); 381 EXPECT_EQ(0U, a-x); 382 } 383 384 TEST(LabelChain, AssignStartRelationBeforeBackward) { 385 Label a, b, c, d; 386 Label x; 387 a = x; 388 d = c + 0x100; 389 c = b + 0x10; 390 b = a + 0x1; 391 EXPECT_EQ(0x111U, d-x); 392 EXPECT_EQ(0x11U, c-x); 393 EXPECT_EQ(0x1U, b-x); 394 EXPECT_EQ(0U, a-x); 395 } 396 397 TEST(LabelChain, AssignStartRelationAfterForward) { 398 Label a, b, c, d; 399 Label x; 400 b = a + 0x1; 401 c = b + 0x10; 402 d = c + 0x100; 403 a = x; 404 EXPECT_EQ(0x111U, d-x); 405 EXPECT_EQ(0x11U, c-x); 406 EXPECT_EQ(0x1U, b-x); 407 EXPECT_EQ(0U, a-x); 408 } 409 410 TEST(LabelChain, AssignStartRelationAfterBackward) { 411 Label a, b, c, d; 412 Label x; 413 d = c + 0x100; 414 c = b + 0x10; 415 b = a + 0x1; 416 a = x; 417 EXPECT_EQ(0x111U, d-x); 418 EXPECT_EQ(0x11U, c-x); 419 EXPECT_EQ(0x1U, b-x); 420 EXPECT_EQ(0U, a-x); 421 } 422 423 TEST(LabelChain, AssignStartValueBeforeForward) { 424 Label a, b, c, d; 425 a = 0xa131200190546ac2ULL; 426 b = a + 0x1; 427 c = b + 0x10; 428 d = c + 0x100; 429 EXPECT_EQ(0xa131200190546ac2ULL + 0x111U, d.Value()); 430 EXPECT_EQ(0xa131200190546ac2ULL + 0x11U, c.Value()); 431 EXPECT_EQ(0xa131200190546ac2ULL + 0x1U, b.Value()); 432 EXPECT_EQ(0xa131200190546ac2ULL + 0U, a.Value()); 433 } 434 435 TEST(LabelChain, AssignStartValueBeforeBackward) { 436 Label a, b, c, d; 437 a = 0x8da17e1670ad4fa2ULL; 438 d = c + 0x100; 439 c = b + 0x10; 440 b = a + 0x1; 441 EXPECT_EQ(0x8da17e1670ad4fa2ULL + 0x111U, d.Value()); 442 EXPECT_EQ(0x8da17e1670ad4fa2ULL + 0x11U, c.Value()); 443 EXPECT_EQ(0x8da17e1670ad4fa2ULL + 0x1U, b.Value()); 444 EXPECT_EQ(0x8da17e1670ad4fa2ULL + 0U, a.Value()); 445 } 446 447 TEST(LabelChain, AssignStartValueAfterForward) { 448 Label a, b, c, d; 449 b = a + 0x1; 450 c = b + 0x10; 451 d = c + 0x100; 452 a = 0x99b8f51bafd41adaULL; 453 EXPECT_EQ(0x99b8f51bafd41adaULL + 0x111U, d.Value()); 454 EXPECT_EQ(0x99b8f51bafd41adaULL + 0x11U, c.Value()); 455 EXPECT_EQ(0x99b8f51bafd41adaULL + 0x1U, b.Value()); 456 EXPECT_EQ(0x99b8f51bafd41adaULL + 0U, a.Value()); 457 } 458 459 TEST(LabelChain, AssignStartValueAfterBackward) { 460 Label a, b, c, d; 461 d = c + 0x100; 462 c = b + 0x10; 463 b = a + 0x1; 464 a = 0xc86ca1d97ab5df6eULL; 465 EXPECT_EQ(0xc86ca1d97ab5df6eULL + 0x111U, d.Value()); 466 EXPECT_EQ(0xc86ca1d97ab5df6eULL + 0x11U, c.Value()); 467 EXPECT_EQ(0xc86ca1d97ab5df6eULL + 0x1U, b.Value()); 468 EXPECT_EQ(0xc86ca1d97ab5df6eULL + 0U, a.Value()); 469 } 470 471 TEST(LabelChain, AssignEndRelationBeforeForward) { 472 Label a, b, c, d; 473 Label x; 474 x = d; 475 b = a + 0x1; 476 c = b + 0x10; 477 d = c + 0x100; 478 EXPECT_EQ(-(uint64_t)0x111U, a-x); 479 EXPECT_EQ(-(uint64_t)0x110U, b-x); 480 EXPECT_EQ(-(uint64_t)0x100U, c-x); 481 EXPECT_EQ(-(uint64_t)0U, d-x); 482 } 483 484 TEST(LabelChain, AssignEndRelationBeforeBackward) { 485 Label a, b, c, d; 486 Label x; 487 x = d; 488 d = c + 0x100; 489 c = b + 0x10; 490 b = a + 0x1; 491 EXPECT_EQ(-(uint64_t)0x111U, a-x); 492 EXPECT_EQ(-(uint64_t)0x110U, b-x); 493 EXPECT_EQ(-(uint64_t)0x100U, c-x); 494 EXPECT_EQ(-(uint64_t)0U, d-x); 495 } 496 497 TEST(LabelChain, AssignEndRelationAfterForward) { 498 Label a, b, c, d; 499 Label x; 500 b = a + 0x1; 501 c = b + 0x10; 502 d = c + 0x100; 503 x = d; 504 EXPECT_EQ(-(uint64_t)0x111U, a-x); 505 EXPECT_EQ(-(uint64_t)0x110U, b-x); 506 EXPECT_EQ(-(uint64_t)0x100U, c-x); 507 EXPECT_EQ(-(uint64_t)0x000U, d-x); 508 } 509 510 TEST(LabelChain, AssignEndRelationAfterBackward) { 511 Label a, b, c, d; 512 Label x; 513 d = c + 0x100; 514 c = b + 0x10; 515 b = a + 0x1; 516 x = d; 517 EXPECT_EQ(-(uint64_t)0x111U, a-x); 518 EXPECT_EQ(-(uint64_t)0x110U, b-x); 519 EXPECT_EQ(-(uint64_t)0x100U, c-x); 520 EXPECT_EQ(-(uint64_t)0x000U, d-x); 521 } 522 523 TEST(LabelChain, AssignEndValueBeforeForward) { 524 Label a, b, c, d; 525 d = 0xa131200190546ac2ULL; 526 b = a + 0x1; 527 c = b + 0x10; 528 d = c + 0x100; 529 EXPECT_EQ(0xa131200190546ac2ULL - 0x111, a.Value()); 530 EXPECT_EQ(0xa131200190546ac2ULL - 0x110, b.Value()); 531 EXPECT_EQ(0xa131200190546ac2ULL - 0x100, c.Value()); 532 EXPECT_EQ(0xa131200190546ac2ULL - 0x000, d.Value()); 533 } 534 535 TEST(LabelChain, AssignEndValueBeforeBackward) { 536 Label a, b, c, d; 537 d = 0x8da17e1670ad4fa2ULL; 538 d = c + 0x100; 539 c = b + 0x10; 540 b = a + 0x1; 541 EXPECT_EQ(0x8da17e1670ad4fa2ULL - 0x111, a.Value()); 542 EXPECT_EQ(0x8da17e1670ad4fa2ULL - 0x110, b.Value()); 543 EXPECT_EQ(0x8da17e1670ad4fa2ULL - 0x100, c.Value()); 544 EXPECT_EQ(0x8da17e1670ad4fa2ULL - 0x000, d.Value()); 545 } 546 547 TEST(LabelChain, AssignEndValueAfterForward) { 548 Label a, b, c, d; 549 b = a + 0x1; 550 c = b + 0x10; 551 d = c + 0x100; 552 d = 0x99b8f51bafd41adaULL; 553 EXPECT_EQ(0x99b8f51bafd41adaULL - 0x111, a.Value()); 554 EXPECT_EQ(0x99b8f51bafd41adaULL - 0x110, b.Value()); 555 EXPECT_EQ(0x99b8f51bafd41adaULL - 0x100, c.Value()); 556 EXPECT_EQ(0x99b8f51bafd41adaULL - 0x000, d.Value()); 557 } 558 559 TEST(LabelChain, AssignEndValueAfterBackward) { 560 Label a, b, c, d; 561 d = c + 0x100; 562 c = b + 0x10; 563 b = a + 0x1; 564 d = 0xc86ca1d97ab5df6eULL; 565 EXPECT_EQ(0xc86ca1d97ab5df6eULL - 0x111, a.Value()); 566 EXPECT_EQ(0xc86ca1d97ab5df6eULL - 0x110, b.Value()); 567 EXPECT_EQ(0xc86ca1d97ab5df6eULL - 0x100, c.Value()); 568 EXPECT_EQ(0xc86ca1d97ab5df6eULL - 0x000, d.Value()); 569 } 570 571 TEST(LabelChain, ConstructStartRelationBeforeForward) { 572 Label x; 573 Label a(x); 574 Label b(a + 0x1); 575 Label c(b + 0x10); 576 Label d(c + 0x100); 577 EXPECT_EQ(0x111U, d-x); 578 EXPECT_EQ(0x11U, c-x); 579 EXPECT_EQ(0x1U, b-x); 580 EXPECT_EQ(0U, a-x); 581 } 582 583 TEST(LabelChain, ConstructStartRelationAfterForward) { 584 Label x; 585 Label a; 586 Label b(a + 0x1); 587 Label c(b + 0x10); 588 Label d(c + 0x100); 589 a = x; 590 EXPECT_EQ(0x111U, d-x); 591 EXPECT_EQ(0x11U, c-x); 592 EXPECT_EQ(0x1U, b-x); 593 EXPECT_EQ(0U, a-x); 594 } 595 596 TEST(LabelChain, ConstructStartValueBeforeForward) { 597 Label a(0x5d234d177d01ccc8ULL); 598 Label b(a + 0x1); 599 Label c(b + 0x10); 600 Label d(c + 0x100); 601 EXPECT_EQ(0x5d234d177d01ccc8ULL + 0x111U, d.Value()); 602 EXPECT_EQ(0x5d234d177d01ccc8ULL + 0x011U, c.Value()); 603 EXPECT_EQ(0x5d234d177d01ccc8ULL + 0x001U, b.Value()); 604 EXPECT_EQ(0x5d234d177d01ccc8ULL + 0x000U, a.Value()); 605 } 606 607 TEST(LabelChain, ConstructStartValueAfterForward) { 608 Label a; 609 Label b(a + 0x1); 610 Label c(b + 0x10); 611 Label d(c + 0x100); 612 a = 0xded85d54586e84fcULL; 613 EXPECT_EQ(0xded85d54586e84fcULL + 0x111U, d.Value()); 614 EXPECT_EQ(0xded85d54586e84fcULL + 0x011U, c.Value()); 615 EXPECT_EQ(0xded85d54586e84fcULL + 0x001U, b.Value()); 616 EXPECT_EQ(0xded85d54586e84fcULL + 0x000U, a.Value()); 617 } 618 619 TEST(LabelChain, ConstructEndRelationAfterForward) { 620 Label x; 621 Label a; 622 Label b(a + 0x1); 623 Label c(b + 0x10); 624 Label d(c + 0x100); 625 x = d; 626 EXPECT_EQ(-(uint64_t)0x111U, a-x); 627 EXPECT_EQ(-(uint64_t)0x110U, b-x); 628 EXPECT_EQ(-(uint64_t)0x100U, c-x); 629 EXPECT_EQ(-(uint64_t)0x000U, d-x); 630 } 631 632 TEST(LabelChain, ConstructEndValueAfterForward) { 633 Label a; 634 Label b(a + 0x1); 635 Label c(b + 0x10); 636 Label d(c + 0x100); 637 d = 0x99b8f51bafd41adaULL; 638 EXPECT_EQ(0x99b8f51bafd41adaULL - 0x111, a.Value()); 639 EXPECT_EQ(0x99b8f51bafd41adaULL - 0x110, b.Value()); 640 EXPECT_EQ(0x99b8f51bafd41adaULL - 0x100, c.Value()); 641 EXPECT_EQ(0x99b8f51bafd41adaULL - 0x000, d.Value()); 642 } 643 644 TEST(LabelTree, KnownValue) { 645 Label l, m, n, o, p; 646 l = m; 647 m = n; 648 o = p; 649 p = n; 650 l = 0x536b5de3d468a1b5ULL; 651 EXPECT_EQ(0x536b5de3d468a1b5ULL, o.Value()); 652 } 653 654 TEST(LabelTree, Related) { 655 Label l, m, n, o, p; 656 l = m - 1; 657 m = n - 10; 658 o = p + 100; 659 p = n + 1000; 660 EXPECT_EQ(1111U, o - l); 661 } 662 663 TEST(EquationDeathTest, EqualConstants) { 664 Label m = 0x0d3962f280f07d24ULL; 665 Label n = 0x0d3962f280f07d24ULL; 666 m = n; // no death expected 667 } 668 669 TEST(EquationDeathTest, EqualIndirectConstants) { 670 Label m = 0xa347f1e5238fe6a1ULL; 671 Label n; 672 Label o = n; 673 n = 0xa347f1e5238fe6a1ULL; 674 n = m; // no death expected 675 } 676 677 TEST(EquationDeathTest, ConstantClash) { 678 Label m = 0xd4cc0f4f630ec741ULL; 679 Label n = 0x934cd2d8254fc3eaULL; 680 ASSERT_DEATH(m = n, "addend_ == addend"); 681 } 682 683 TEST(EquationDeathTest, IndirectConstantClash) { 684 Label m = 0xd4cc0f4f630ec741ULL; 685 Label n, o; 686 n = o; 687 o = 0xcfbe3b83ac49ce86ULL; 688 ASSERT_DEATH(m = n, "addend_ == addend"); 689 } 690 691 // Assigning to a related label may free the next Binding on its 692 // chain. This test always passes; it is interesting to memory 693 // checkers and coverage analysis. 694 TEST(LabelReferenceCount, AssignmentFree) { 695 Label l; 696 { 697 Label m; 698 l = m; 699 } 700 // This should free m's Binding. 701 l = 0xca8bae92f0376d4fULL; 702 ASSERT_EQ(0xca8bae92f0376d4fULL, l.Value()); 703 } 704 705 // Finding the value of a label may free the Binding it refers to. This test 706 // always passes; it is interesting to memory checkers and coverage analysis. 707 TEST(LabelReferenceCount, FindValueFree) { 708 Label l; 709 { 710 Label m, n; 711 l = m; 712 m = n; 713 n = 0x7a0b0c576672daafULL; 714 // At this point, l's Binding refers to m's Binding, which refers 715 // to n's binding. 716 } 717 // Now, l is the only reference keeping the three Bindings alive. 718 // Resolving its value should free l's and m's original bindings. 719 ASSERT_EQ(0x7a0b0c576672daafULL, l.Value()); 720 } 721 722 TEST(ConstructSection, Simple) { 723 Section s; 724 } 725 726 TEST(ConstructSection, WithEndian) { 727 Section s(kBigEndian); 728 } 729 730 // A fixture class for TestAssembler::Section tests. 731 class SectionFixture { 732 public: 733 Section section; 734 string contents; 735 static const uint8_t data[]; 736 static const size_t data_size; 737 }; 738 739 const uint8_t SectionFixture::data[] = { 740 0x87, 0x4f, 0x43, 0x67, 0x30, 0xd0, 0xd4, 0x0e 741 }; 742 743 #define I0() 744 #define I1(a) { a } 745 #define I2(a,b) { a,b } 746 #define I3(a,b,c) { a,b,c } 747 #define I4(a,b,c,d) { a,b,c,d } 748 #define I5(a,b,c,d,e) { a,b,c,d,e } 749 #define I6(a,b,c,d,e,f) { a,b,c,d,e,f } 750 #define I7(a,b,c,d,e,f,g) { a,b,c,d,e,f,g } 751 #define I8(a,b,c,d,e,f,g,h) { a,b,c,d,e,f,g,h } 752 #define I9(a,b,c,d,e,f,g,h,i) { a,b,c,d,e,f,g,h,i } 753 #define ASSERT_BYTES(s, b) \ 754 do \ 755 { \ 756 static const uint8_t expected_bytes[] = b; \ 757 ASSERT_EQ(sizeof(expected_bytes), s.size()); \ 758 ASSERT_TRUE(memcmp(s.data(), (const char *) expected_bytes, \ 759 sizeof(expected_bytes)) == 0); \ 760 } \ 761 while(0) 762 763 class Append: public SectionFixture, public Test { }; 764 765 TEST_F(Append, Bytes) { 766 section.Append(data, sizeof(data)); 767 ASSERT_TRUE(section.GetContents(&contents)); 768 ASSERT_EQ(sizeof(data), contents.size()); 769 EXPECT_TRUE(0 == memcmp(contents.data(), (const char *) data, sizeof(data))); 770 } 771 772 TEST_F(Append, BytesTwice) { 773 section.Append(data, sizeof(data)); 774 section.Append(data, sizeof(data)); 775 ASSERT_TRUE(section.GetContents(&contents)); 776 ASSERT_EQ(2 * sizeof(data), contents.size()); 777 ASSERT_TRUE(0 == memcmp(contents.data(), (const char *) data, sizeof(data))); 778 ASSERT_TRUE(0 == memcmp(contents.data() + sizeof(data), 779 (const char *) data, sizeof(data))); 780 } 781 782 TEST_F(Append, String) { 783 string s1 = "howdy "; 784 string s2 = "there"; 785 section.Append(s1); 786 section.Append(s2); 787 ASSERT_TRUE(section.GetContents(&contents)); 788 ASSERT_STREQ(contents.c_str(), "howdy there"); 789 } 790 791 TEST_F(Append, CString) { 792 section.AppendCString("howdy"); 793 section.AppendCString(""); 794 section.AppendCString("there"); 795 ASSERT_TRUE(section.GetContents(&contents)); 796 ASSERT_EQ(string("howdy\0\0there\0", 13), contents); 797 } 798 799 TEST_F(Append, CStringSize) { 800 section.AppendCString("howdy", 3); 801 section.AppendCString("there", 5); 802 section.AppendCString("fred", 6); 803 section.AppendCString("natalie", 0); 804 section.AppendCString("", 10); 805 ASSERT_TRUE(section.GetContents(&contents)); 806 ASSERT_EQ(string("howtherefred\0\0\0\0\0\0\0\0\0\0\0\0", 24), contents); 807 } 808 809 TEST_F(Append, RepeatedBytes) { 810 section.Append((size_t) 10, '*'); 811 ASSERT_TRUE(section.GetContents(&contents)); 812 ASSERT_STREQ(contents.c_str(), "**********"); 813 } 814 815 TEST_F(Append, GeneralLE1) { 816 section.Append(kLittleEndian, 1, 42); 817 ASSERT_TRUE(section.GetContents(&contents)); 818 ASSERT_BYTES(contents, I1(42)); 819 } 820 821 TEST_F(Append, GeneralLE2) { 822 section.Append(kLittleEndian, 2, 0x15a1); 823 ASSERT_TRUE(section.GetContents(&contents)); 824 ASSERT_BYTES(contents, I2(0xa1, 0x15)); 825 } 826 827 TEST_F(Append, GeneralLE3) { 828 section.Append(kLittleEndian, 3, 0x59ae8d); 829 ASSERT_TRUE(section.GetContents(&contents)); 830 ASSERT_BYTES(contents, I3(0x8d, 0xae, 0x59)); 831 } 832 833 TEST_F(Append, GeneralLE4) { 834 section.Append(kLittleEndian, 4, 0x51603c56); 835 ASSERT_TRUE(section.GetContents(&contents)); 836 ASSERT_BYTES(contents, I4(0x56, 0x3c, 0x60, 0x51)); 837 } 838 839 TEST_F(Append, GeneralLE5) { 840 section.Append(kLittleEndian, 5, 0x385e2803b4ULL); 841 ASSERT_TRUE(section.GetContents(&contents)); 842 ASSERT_BYTES(contents, I5(0xb4, 0x03, 0x28, 0x5e, 0x38)); 843 } 844 845 TEST_F(Append, GeneralLE6) { 846 section.Append(kLittleEndian, 6, 0xc7db9534dd1fULL); 847 ASSERT_TRUE(section.GetContents(&contents)); 848 ASSERT_BYTES(contents, I6(0x1f, 0xdd, 0x34, 0x95, 0xdb, 0xc7)); 849 } 850 851 TEST_F(Append, GeneralLE7) { 852 section.Append(kLittleEndian, 7, 0x1445c9f1b843e6ULL); 853 ASSERT_TRUE(section.GetContents(&contents)); 854 ASSERT_BYTES(contents, I7(0xe6, 0x43, 0xb8, 0xf1, 0xc9, 0x45, 0x14)); 855 } 856 857 TEST_F(Append, GeneralLE8) { 858 section.Append(kLittleEndian, 8, 0xaf48019dfe5c01e5ULL); 859 ASSERT_TRUE(section.GetContents(&contents)); 860 ASSERT_BYTES(contents, I8(0xe5, 0x01, 0x5c, 0xfe, 0x9d, 0x01, 0x48, 0xaf)); 861 } 862 863 TEST_F(Append, GeneralBE1) { 864 section.Append(kBigEndian, 1, 0xd0ULL); 865 ASSERT_TRUE(section.GetContents(&contents)); 866 ASSERT_BYTES(contents, I1(0xd0)); 867 } 868 869 TEST_F(Append, GeneralBE2) { 870 section.Append(kBigEndian, 2, 0x2e7eULL); 871 ASSERT_TRUE(section.GetContents(&contents)); 872 ASSERT_BYTES(contents, I2(0x2e, 0x7e)); 873 } 874 875 TEST_F(Append, GeneralBE3) { 876 section.Append(kBigEndian, 3, 0x37dad6ULL); 877 ASSERT_TRUE(section.GetContents(&contents)); 878 ASSERT_BYTES(contents, I3(0x37, 0xda, 0xd6)); 879 } 880 881 TEST_F(Append, GeneralBE4) { 882 section.Append(kBigEndian, 4, 0x715935c7ULL); 883 ASSERT_TRUE(section.GetContents(&contents)); 884 ASSERT_BYTES(contents, I4(0x71, 0x59, 0x35, 0xc7)); 885 } 886 887 TEST_F(Append, GeneralBE5) { 888 section.Append(kBigEndian, 5, 0x42baeb02b7ULL); 889 ASSERT_TRUE(section.GetContents(&contents)); 890 ASSERT_BYTES(contents, I5(0x42, 0xba, 0xeb, 0x02, 0xb7)); 891 } 892 893 TEST_F(Append, GeneralBE6) { 894 section.Append(kBigEndian, 6, 0xf1cdf10e7b18ULL); 895 ASSERT_TRUE(section.GetContents(&contents)); 896 ASSERT_BYTES(contents, I6(0xf1, 0xcd, 0xf1, 0x0e, 0x7b, 0x18)); 897 } 898 899 TEST_F(Append, GeneralBE7) { 900 section.Append(kBigEndian, 7, 0xf50a724f0b0d20ULL); 901 ASSERT_TRUE(section.GetContents(&contents)); 902 ASSERT_BYTES(contents, I7(0xf5, 0x0a, 0x72, 0x4f, 0x0b, 0x0d, 0x20)); 903 } 904 905 TEST_F(Append, GeneralBE8) { 906 section.Append(kBigEndian, 8, 0xa6b2cb5e98dc9c16ULL); 907 ASSERT_TRUE(section.GetContents(&contents)); 908 ASSERT_BYTES(contents, I8(0xa6, 0xb2, 0xcb, 0x5e, 0x98, 0xdc, 0x9c, 0x16)); 909 } 910 911 TEST_F(Append, GeneralLE1Label) { 912 Label l; 913 section.Append(kLittleEndian, 1, l); 914 l = 42; 915 ASSERT_TRUE(section.GetContents(&contents)); 916 ASSERT_BYTES(contents, I1(42)); 917 } 918 919 TEST_F(Append, GeneralLE2Label) { 920 Label l; 921 section.Append(kLittleEndian, 2, l); 922 l = 0x15a1; 923 ASSERT_TRUE(section.GetContents(&contents)); 924 ASSERT_BYTES(contents, I2(0xa1, 0x15)); 925 } 926 927 TEST_F(Append, GeneralLE3Label) { 928 Label l; 929 section.Append(kLittleEndian, 3, l); 930 l = 0x59ae8d; 931 ASSERT_TRUE(section.GetContents(&contents)); 932 ASSERT_BYTES(contents, I3(0x8d, 0xae, 0x59)); 933 } 934 935 TEST_F(Append, GeneralLE4Label) { 936 Label l; 937 section.Append(kLittleEndian, 4, l); 938 l = 0x51603c56; 939 ASSERT_TRUE(section.GetContents(&contents)); 940 ASSERT_BYTES(contents, I4(0x56, 0x3c, 0x60, 0x51)); 941 } 942 943 TEST_F(Append, GeneralLE5Label) { 944 Label l; 945 section.Append(kLittleEndian, 5, l); 946 l = 0x385e2803b4ULL; 947 ASSERT_TRUE(section.GetContents(&contents)); 948 ASSERT_BYTES(contents, I5(0xb4, 0x03, 0x28, 0x5e, 0x38)); 949 } 950 951 TEST_F(Append, GeneralLE6Label) { 952 Label l; 953 section.Append(kLittleEndian, 6, l); 954 l = 0xc7db9534dd1fULL; 955 ASSERT_TRUE(section.GetContents(&contents)); 956 ASSERT_BYTES(contents, I6(0x1f, 0xdd, 0x34, 0x95, 0xdb, 0xc7)); 957 } 958 959 TEST_F(Append, GeneralLE7Label) { 960 Label l; 961 section.Append(kLittleEndian, 7, l); 962 l = 0x1445c9f1b843e6ULL; 963 ASSERT_TRUE(section.GetContents(&contents)); 964 ASSERT_BYTES(contents, I7(0xe6, 0x43, 0xb8, 0xf1, 0xc9, 0x45, 0x14)); 965 } 966 967 TEST_F(Append, GeneralLE8Label) { 968 Label l; 969 section.Append(kLittleEndian, 8, l); 970 l = 0xaf48019dfe5c01e5ULL; 971 ASSERT_TRUE(section.GetContents(&contents)); 972 ASSERT_BYTES(contents, I8(0xe5, 0x01, 0x5c, 0xfe, 0x9d, 0x01, 0x48, 0xaf)); 973 } 974 975 TEST_F(Append, GeneralBE1Label) { 976 Label l; 977 section.Append(kBigEndian, 1, l); 978 l = 0xd0ULL; 979 ASSERT_TRUE(section.GetContents(&contents)); 980 ASSERT_BYTES(contents, I1(0xd0)); 981 } 982 983 TEST_F(Append, GeneralBE2Label) { 984 Label l; 985 section.Append(kBigEndian, 2, l); 986 l = 0x2e7eULL; 987 ASSERT_TRUE(section.GetContents(&contents)); 988 ASSERT_BYTES(contents, I2(0x2e, 0x7e)); 989 } 990 991 TEST_F(Append, GeneralBE3Label) { 992 Label l; 993 section.Append(kBigEndian, 3, l); 994 l = 0x37dad6ULL; 995 ASSERT_TRUE(section.GetContents(&contents)); 996 ASSERT_BYTES(contents, I3(0x37, 0xda, 0xd6)); 997 } 998 999 TEST_F(Append, GeneralBE4Label) { 1000 Label l; 1001 section.Append(kBigEndian, 4, l); 1002 l = 0x715935c7ULL; 1003 ASSERT_TRUE(section.GetContents(&contents)); 1004 ASSERT_BYTES(contents, I4(0x71, 0x59, 0x35, 0xc7)); 1005 } 1006 1007 TEST_F(Append, GeneralBE5Label) { 1008 Label l; 1009 section.Append(kBigEndian, 5, l); 1010 l = 0x42baeb02b7ULL; 1011 ASSERT_TRUE(section.GetContents(&contents)); 1012 ASSERT_BYTES(contents, I5(0x42, 0xba, 0xeb, 0x02, 0xb7)); 1013 } 1014 1015 TEST_F(Append, GeneralBE6Label) { 1016 Label l; 1017 section.Append(kBigEndian, 6, l); 1018 l = 0xf1cdf10e7b18ULL; 1019 ASSERT_TRUE(section.GetContents(&contents)); 1020 ASSERT_BYTES(contents, I6(0xf1, 0xcd, 0xf1, 0x0e, 0x7b, 0x18)); 1021 } 1022 1023 TEST_F(Append, GeneralBE7Label) { 1024 Label l; 1025 section.Append(kBigEndian, 7, l); 1026 l = 0xf50a724f0b0d20ULL; 1027 ASSERT_TRUE(section.GetContents(&contents)); 1028 ASSERT_BYTES(contents, I7(0xf5, 0x0a, 0x72, 0x4f, 0x0b, 0x0d, 0x20)); 1029 } 1030 1031 TEST_F(Append, GeneralBE8Label) { 1032 Label l; 1033 section.Append(kBigEndian, 8, l); 1034 l = 0xa6b2cb5e98dc9c16ULL; 1035 ASSERT_TRUE(section.GetContents(&contents)); 1036 ASSERT_BYTES(contents, I8(0xa6, 0xb2, 0xcb, 0x5e, 0x98, 0xdc, 0x9c, 0x16)); 1037 } 1038 1039 TEST_F(Append, B8) { 1040 section.Append(1, 0x2a); 1041 section.B8(0xd3U); 1042 ASSERT_TRUE(section.GetContents(&contents)); 1043 ASSERT_BYTES(contents, I2(0x2a, 0xd3)); 1044 } 1045 1046 TEST_F(Append, B8Label) { 1047 Label l; 1048 section.Append(1, 0x2a); 1049 section.B8(l); 1050 l = 0x4bU; 1051 ASSERT_TRUE(section.GetContents(&contents)); 1052 ASSERT_BYTES(contents, I2(0x2a, 0x4b)); 1053 } 1054 1055 TEST_F(Append, B16) { 1056 section.Append(1, 0x2a); 1057 section.B16(0x472aU); 1058 ASSERT_TRUE(section.GetContents(&contents)); 1059 ASSERT_BYTES(contents, I3(0x2a, 0x47, 0x2a)); 1060 } 1061 1062 TEST_F(Append, B16Label) { 1063 Label l; 1064 section.Append(1, 0x2a); 1065 section.B16(l); 1066 l = 0x55e8U; 1067 ASSERT_TRUE(section.GetContents(&contents)); 1068 ASSERT_BYTES(contents, I3(0x2a, 0x55, 0xe8)); 1069 } 1070 1071 TEST_F(Append, B32) { 1072 section.Append(1, 0x2a); 1073 section.B32(0xbd412cbcU); 1074 ASSERT_TRUE(section.GetContents(&contents)); 1075 ASSERT_BYTES(contents, I5(0x2a, 0xbd, 0x41, 0x2c, 0xbc)); 1076 } 1077 1078 TEST_F(Append, B32Label) { 1079 Label l; 1080 section.Append(1, 0x2a); 1081 section.B32(l); 1082 l = 0x208e37d5U; 1083 ASSERT_TRUE(section.GetContents(&contents)); 1084 ASSERT_BYTES(contents, I5(0x2a, 0x20, 0x8e, 0x37, 0xd5)); 1085 } 1086 1087 TEST_F(Append, B64) { 1088 section.Append(1, 0x2a); 1089 section.B64(0x3402a013111e68adULL); 1090 ASSERT_TRUE(section.GetContents(&contents)); 1091 ASSERT_BYTES(contents, 1092 I9(0x2a, 0x34, 0x02, 0xa0, 0x13, 0x11, 0x1e, 0x68, 0xad)); 1093 } 1094 1095 TEST_F(Append, B64Label) { 1096 Label l; 1097 section.Append(1, 0x2a); 1098 section.B64(l); 1099 l = 0x355dbfbb4ac6d57fULL; 1100 ASSERT_TRUE(section.GetContents(&contents)); 1101 ASSERT_BYTES(contents, 1102 I9(0x2a, 0x35, 0x5d, 0xbf, 0xbb, 0x4a, 0xc6, 0xd5, 0x7f)); 1103 } 1104 1105 TEST_F(Append, L8) { 1106 section.Append(1, 0x2a); 1107 section.L8(0x26U); 1108 ASSERT_TRUE(section.GetContents(&contents)); 1109 ASSERT_BYTES(contents, I2(0x2a, 0x26)); 1110 } 1111 1112 TEST_F(Append, L8Label) { 1113 Label l; 1114 section.Append(1, 0x2a); 1115 section.L8(l); 1116 l = 0xa8U; 1117 ASSERT_TRUE(section.GetContents(&contents)); 1118 ASSERT_BYTES(contents, I2(0x2a, 0xa8)); 1119 } 1120 1121 TEST_F(Append, L16) { 1122 section.Append(1, 0x2a); 1123 section.L16(0xca6dU); 1124 ASSERT_TRUE(section.GetContents(&contents)); 1125 ASSERT_BYTES(contents, I3(0x2a, 0x6d, 0xca)); 1126 } 1127 1128 TEST_F(Append, L16Label) { 1129 Label l; 1130 section.Append(1, 0x2a); 1131 section.L16(l); 1132 l = 0xd21fU; 1133 ASSERT_TRUE(section.GetContents(&contents)); 1134 ASSERT_BYTES(contents, I3(0x2a, 0x1f, 0xd2)); 1135 } 1136 1137 TEST_F(Append, L32) { 1138 section.Append(1, 0x2a); 1139 section.L32(0x558f6181U); 1140 ASSERT_TRUE(section.GetContents(&contents)); 1141 ASSERT_BYTES(contents, I5(0x2a, 0x81, 0x61, 0x8f, 0x55)); 1142 } 1143 1144 TEST_F(Append, L32Label) { 1145 Label l; 1146 section.Append(1, 0x2a); 1147 section.L32(l); 1148 l = 0x4b810f82U; 1149 ASSERT_TRUE(section.GetContents(&contents)); 1150 ASSERT_BYTES(contents, I5(0x2a, 0x82, 0x0f, 0x81, 0x4b)); 1151 } 1152 1153 TEST_F(Append, L64) { 1154 section.Append(1, 0x2a); 1155 section.L64(0x564384f7579515bfULL); 1156 ASSERT_TRUE(section.GetContents(&contents)); 1157 ASSERT_BYTES(contents, 1158 I9(0x2a, 0xbf, 0x15, 0x95, 0x57, 0xf7, 0x84, 0x43, 0x56)); 1159 } 1160 1161 TEST_F(Append, L64Label) { 1162 Label l; 1163 section.Append(1, 0x2a); 1164 section.L64(l); 1165 l = 0x424b1d020667c8dbULL; 1166 ASSERT_TRUE(section.GetContents(&contents)); 1167 ASSERT_BYTES(contents, 1168 I9(0x2a, 0xdb, 0xc8, 0x67, 0x06, 0x02, 0x1d, 0x4b, 0x42)); 1169 } 1170 1171 TEST_F(Append, D8Big) { 1172 section.set_endianness(kBigEndian); 1173 section.Append(1, 0x2a); 1174 section.D8(0xe6U); 1175 ASSERT_TRUE(section.GetContents(&contents)); 1176 ASSERT_BYTES(contents, I2(0x2a, 0xe6)); 1177 } 1178 1179 TEST_F(Append, D8BigLabel) { 1180 Label l; 1181 section.set_endianness(kBigEndian); 1182 section.Append(1, 0x2a); 1183 section.D8(l); 1184 l = 0xeeU; 1185 ASSERT_TRUE(section.GetContents(&contents)); 1186 ASSERT_BYTES(contents, I2(0x2a, 0xee)); 1187 } 1188 1189 TEST_F(Append, D16Big) { 1190 section.set_endianness(kBigEndian); 1191 section.Append(1, 0x2a); 1192 section.D16(0x83b1U); 1193 ASSERT_TRUE(section.GetContents(&contents)); 1194 ASSERT_BYTES(contents, I3(0x2a, 0x83, 0xb1)); 1195 } 1196 1197 TEST_F(Append, D16BigLabel) { 1198 Label l; 1199 section.set_endianness(kBigEndian); 1200 section.Append(1, 0x2a); 1201 section.D16(l); 1202 l = 0x5b55U; 1203 ASSERT_TRUE(section.GetContents(&contents)); 1204 ASSERT_BYTES(contents, I3(0x2a, 0x5b, 0x55)); 1205 } 1206 1207 TEST_F(Append, D32Big) { 1208 section.set_endianness(kBigEndian); 1209 section.Append(1, 0x2a); 1210 section.D32(0xd0b0e431U); 1211 ASSERT_TRUE(section.GetContents(&contents)); 1212 ASSERT_BYTES(contents, I5(0x2a, 0xd0, 0xb0, 0xe4, 0x31)); 1213 } 1214 1215 TEST_F(Append, D32BigLabel) { 1216 Label l; 1217 section.set_endianness(kBigEndian); 1218 section.Append(1, 0x2a); 1219 section.D32(l); 1220 l = 0x312fb340U; 1221 ASSERT_TRUE(section.GetContents(&contents)); 1222 ASSERT_BYTES(contents, I5(0x2a, 0x31, 0x2f, 0xb3, 0x40)); 1223 } 1224 1225 TEST_F(Append, D64Big) { 1226 section.set_endianness(kBigEndian); 1227 section.Append(1, 0x2a); 1228 section.D64(0xb109843500dbcb16ULL); 1229 ASSERT_TRUE(section.GetContents(&contents)); 1230 ASSERT_BYTES(contents, 1231 I9(0x2a, 0xb1, 0x09, 0x84, 0x35, 0x00, 0xdb, 0xcb, 0x16)); 1232 } 1233 1234 TEST_F(Append, D64BigLabel) { 1235 Label l; 1236 section.set_endianness(kBigEndian); 1237 section.Append(1, 0x2a); 1238 section.D64(l); 1239 l = 0x9a0d61b70f671fd7ULL; 1240 ASSERT_TRUE(section.GetContents(&contents)); 1241 ASSERT_BYTES(contents, 1242 I9(0x2a, 0x9a, 0x0d, 0x61, 0xb7, 0x0f, 0x67, 0x1f, 0xd7)); 1243 } 1244 1245 TEST_F(Append, D8Little) { 1246 section.set_endianness(kLittleEndian); 1247 section.Append(1, 0x2a); 1248 section.D8(0x42U); 1249 ASSERT_TRUE(section.GetContents(&contents)); 1250 ASSERT_BYTES(contents, I2(0x2a, 0x42)); 1251 } 1252 1253 TEST_F(Append, D8LittleLabel) { 1254 Label l; 1255 section.set_endianness(kLittleEndian); 1256 section.Append(1, 0x2a); 1257 section.D8(l); 1258 l = 0x05U; 1259 ASSERT_TRUE(section.GetContents(&contents)); 1260 ASSERT_BYTES(contents, I2(0x2a, 0x05)); 1261 } 1262 1263 TEST_F(Append, D16Little) { 1264 section.set_endianness(kLittleEndian); 1265 section.Append(1, 0x2a); 1266 section.D16(0xc5c5U); 1267 ASSERT_TRUE(section.GetContents(&contents)); 1268 ASSERT_BYTES(contents, I3(0x2a, 0xc5, 0xc5)); 1269 } 1270 1271 TEST_F(Append, D16LittleLabel) { 1272 Label l; 1273 section.set_endianness(kLittleEndian); 1274 section.Append(1, 0x2a); 1275 section.D16(l); 1276 l = 0xb620U; 1277 ASSERT_TRUE(section.GetContents(&contents)); 1278 ASSERT_BYTES(contents, I3(0x2a, 0x20, 0xb6)); 1279 } 1280 1281 TEST_F(Append, D32Little) { 1282 section.set_endianness(kLittleEndian); 1283 section.Append(1, 0x2a); 1284 section.D32(0x1a87d0feU); 1285 ASSERT_TRUE(section.GetContents(&contents)); 1286 ASSERT_BYTES(contents, I5(0x2a, 0xfe, 0xd0, 0x87, 0x1a)); 1287 } 1288 1289 TEST_F(Append, D32LittleLabel) { 1290 Label l; 1291 section.set_endianness(kLittleEndian); 1292 section.Append(1, 0x2a); 1293 section.D32(l); 1294 l = 0xb8012d6bU; 1295 ASSERT_TRUE(section.GetContents(&contents)); 1296 ASSERT_BYTES(contents, I5(0x2a, 0x6b, 0x2d, 0x01, 0xb8)); 1297 } 1298 1299 TEST_F(Append, D64Little) { 1300 section.set_endianness(kLittleEndian); 1301 section.Append(1, 0x2a); 1302 section.D64(0x42de75c61375a1deULL); 1303 ASSERT_TRUE(section.GetContents(&contents)); 1304 ASSERT_BYTES(contents, 1305 I9(0x2a, 0xde, 0xa1, 0x75, 0x13, 0xc6, 0x75, 0xde, 0x42)); 1306 } 1307 1308 TEST_F(Append, D64LittleLabel) { 1309 Label l; 1310 section.set_endianness(kLittleEndian); 1311 section.Append(1, 0x2a); 1312 section.D64(l); 1313 l = 0x8b3bececf3fb5312ULL; 1314 ASSERT_TRUE(section.GetContents(&contents)); 1315 ASSERT_BYTES(contents, 1316 I9(0x2a, 0x12, 0x53, 0xfb, 0xf3, 0xec, 0xec, 0x3b, 0x8b)); 1317 } 1318 1319 TEST_F(Append, Variety) { 1320 Label a, b, c, d, e, f, g, h; 1321 section.Append(kBigEndian, 1, a) 1322 .Append(kLittleEndian, 8, h) 1323 .Append(kBigEndian, 1, 0x8bULL) 1324 .Append(kLittleEndian, 8, 0x0ea56540448f4439ULL) 1325 .Append(kBigEndian, 2, b) 1326 .Append(kLittleEndian, 7, g) 1327 .Append(kBigEndian, 2, 0xcf15ULL) 1328 .Append(kLittleEndian, 7, 0x29694f04c5724aULL) 1329 .Append(kBigEndian, 3, c) 1330 .Append(kLittleEndian, 6, f) 1331 .Append(kBigEndian, 3, 0x8c3ffdULL) 1332 .Append(kLittleEndian, 6, 0x6f11ba80187aULL) 1333 .Append(kBigEndian, 4, d) 1334 .Append(kLittleEndian, 5, e) 1335 .Append(kBigEndian, 4, 0x2fda2472ULL) 1336 .Append(kLittleEndian, 5, 0x0aa02d423fULL) 1337 .Append(kBigEndian, 5, e) 1338 .Append(kLittleEndian, 4, d) 1339 .Append(kBigEndian, 5, 0x53ba432138ULL) 1340 .Append(kLittleEndian, 4, 0xf139ae60ULL) 1341 .Append(kBigEndian, 6, f) 1342 .Append(kLittleEndian, 3, c) 1343 .Append(kBigEndian, 6, 0x168e436af716ULL) 1344 .Append(kLittleEndian, 3, 0x3ef189ULL) 1345 .Append(kBigEndian, 7, g) 1346 .Append(kLittleEndian, 2, b) 1347 .Append(kBigEndian, 7, 0xacd4ef233e47d9ULL) 1348 .Append(kLittleEndian, 2, 0x5311ULL) 1349 .Append(kBigEndian, 8, h) 1350 .Append(kLittleEndian, 1, a) 1351 .Append(kBigEndian, 8, 0x4668d5f1c93637a1ULL) 1352 .Append(kLittleEndian, 1, 0x65ULL); 1353 a = 0x79ac9bd8aa256b35ULL; 1354 b = 0x22d13097ef86c91cULL; 1355 c = 0xf204968b0a05862fULL; 1356 d = 0x163177f15a0eb4ecULL; 1357 e = 0xbd1b0f1d977f2246ULL; 1358 f = 0x2b0842eee83c6461ULL; 1359 g = 0x92f4b928a4bf875eULL; 1360 h = 0x61a199a8f7286ba6ULL; 1361 ASSERT_EQ(8 * 18U, section.Size()); 1362 ASSERT_TRUE(section.GetContents(&contents)); 1363 1364 static const uint8_t expected[] = { 1365 0x35, 0xa6, 0x6b, 0x28, 0xf7, 0xa8, 0x99, 0xa1, 0x61, 1366 0x8b, 0x39, 0x44, 0x8f, 0x44, 0x40, 0x65, 0xa5, 0x0e, 1367 0xc9, 0x1c, 0x5e, 0x87, 0xbf, 0xa4, 0x28, 0xb9, 0xf4, 1368 0xcf, 0x15, 0x4a, 0x72, 0xc5, 0x04, 0x4f, 0x69, 0x29, 1369 0x05, 0x86, 0x2f, 0x61, 0x64, 0x3c, 0xe8, 0xee, 0x42, 1370 0x8c, 0x3f, 0xfd, 0x7a, 0x18, 0x80, 0xba, 0x11, 0x6f, 1371 0x5a, 0x0e, 0xb4, 0xec, 0x46, 0x22, 0x7f, 0x97, 0x1d, 1372 0x2f, 0xda, 0x24, 0x72, 0x3f, 0x42, 0x2d, 0xa0, 0x0a, 1373 0x1d, 0x97, 0x7f, 0x22, 0x46, 0xec, 0xb4, 0x0e, 0x5a, 1374 0x53, 0xba, 0x43, 0x21, 0x38, 0x60, 0xae, 0x39, 0xf1, 1375 0x42, 0xee, 0xe8, 0x3c, 0x64, 0x61, 0x2f, 0x86, 0x05, 1376 0x16, 0x8e, 0x43, 0x6a, 0xf7, 0x16, 0x89, 0xf1, 0x3e, 1377 0xf4, 0xb9, 0x28, 0xa4, 0xbf, 0x87, 0x5e, 0x1c, 0xc9, 1378 0xac, 0xd4, 0xef, 0x23, 0x3e, 0x47, 0xd9, 0x11, 0x53, 1379 0x61, 0xa1, 0x99, 0xa8, 0xf7, 0x28, 0x6b, 0xa6, 0x35, 1380 0x46, 0x68, 0xd5, 0xf1, 0xc9, 0x36, 0x37, 0xa1, 0x65, 1381 }; 1382 1383 ASSERT_TRUE(0 == memcmp(contents.data(), expected, sizeof(expected))); 1384 } 1385 1386 TEST_F(Append, Section) { 1387 section.Append("murder"); 1388 { 1389 Section middle; 1390 middle.Append(" she"); 1391 section.Append(middle); 1392 } 1393 section.Append(" wrote"); 1394 EXPECT_EQ(16U, section.Size()); 1395 EXPECT_TRUE(section.GetContents(&contents)); 1396 EXPECT_STREQ(contents.c_str(), "murder she wrote"); 1397 } 1398 1399 TEST_F(Append, SectionRefs) { 1400 section.Append("sugar "); 1401 Label l; 1402 { 1403 Section middle; 1404 Label m; 1405 middle.B32(m); 1406 section.Append(middle); 1407 m = 0x66726565; 1408 } 1409 section.Append(" jazz"); 1410 EXPECT_EQ(15U, section.Size()); 1411 EXPECT_TRUE(section.GetContents(&contents)); 1412 EXPECT_STREQ(contents.c_str(), "sugar free jazz"); 1413 } 1414 1415 TEST_F(Append, LEB128_0) { 1416 section.LEB128(0); 1417 EXPECT_TRUE(section.GetContents(&contents)); 1418 EXPECT_EQ(string("\0", 1), contents); 1419 } 1420 1421 TEST_F(Append, LEB128_0x3f) { 1422 section.LEB128(0x3f); 1423 EXPECT_TRUE(section.GetContents(&contents)); 1424 EXPECT_EQ(string("\x3f", 1), contents); 1425 } 1426 1427 TEST_F(Append, LEB128_0x40) { 1428 section.LEB128(0x40); 1429 EXPECT_TRUE(section.GetContents(&contents)); 1430 EXPECT_EQ(string("\xc0\x00", 2), contents); 1431 } 1432 1433 TEST_F(Append, LEB128_0x7f) { 1434 section.LEB128(0x7f); 1435 EXPECT_TRUE(section.GetContents(&contents)); 1436 EXPECT_EQ(string("\xff\x00", 2), contents); 1437 } 1438 1439 TEST_F(Append, LEB128_0x80) { 1440 section.LEB128(0x80); 1441 EXPECT_TRUE(section.GetContents(&contents)); 1442 EXPECT_EQ(string("\x80\x01", 2), contents); 1443 } 1444 1445 TEST_F(Append, LEB128_0xff) { 1446 section.LEB128(0xff); 1447 EXPECT_TRUE(section.GetContents(&contents)); 1448 EXPECT_EQ(string("\xff\x01", 2), contents); 1449 } 1450 1451 TEST_F(Append, LEB128_0x1fff) { 1452 section.LEB128(0x1fff); 1453 EXPECT_TRUE(section.GetContents(&contents)); 1454 EXPECT_EQ(string("\xff\x3f", 2), contents); 1455 } 1456 1457 TEST_F(Append, LEB128_0x2000) { 1458 section.LEB128(0x2000); 1459 EXPECT_TRUE(section.GetContents(&contents)); 1460 EXPECT_EQ(string("\x80\xc0\x00", 3), contents); 1461 } 1462 1463 TEST_F(Append, LEB128_n1) { 1464 section.LEB128(-1); 1465 EXPECT_TRUE(section.GetContents(&contents)); 1466 EXPECT_EQ(string("\x7f", 1), contents); 1467 } 1468 1469 TEST_F(Append, LEB128_n0x40) { 1470 section.LEB128(-0x40); 1471 EXPECT_TRUE(section.GetContents(&contents)); 1472 EXPECT_EQ(string("\x40", 1), contents); 1473 } 1474 1475 TEST_F(Append, LEB128_n0x41) { 1476 section.LEB128(-0x41); 1477 EXPECT_TRUE(section.GetContents(&contents)); 1478 EXPECT_EQ(string("\xbf\x7f", 2), contents); 1479 } 1480 1481 TEST_F(Append, LEB128_n0x7f) { 1482 section.LEB128(-0x7f); 1483 EXPECT_TRUE(section.GetContents(&contents)); 1484 EXPECT_EQ(string("\x81\x7f", 2), contents); 1485 } 1486 1487 TEST_F(Append, LEB128_n0x80) { 1488 section.LEB128(-0x80); 1489 EXPECT_TRUE(section.GetContents(&contents)); 1490 EXPECT_EQ(string("\x80\x7f", 2), contents); 1491 } 1492 1493 TEST_F(Append, LEB128_n0x2000) { 1494 section.LEB128(-0x2000); 1495 EXPECT_TRUE(section.GetContents(&contents)); 1496 EXPECT_EQ(string("\x80\x40", 2), contents); 1497 } 1498 1499 TEST_F(Append, LEB128_n0x2001) { 1500 section.LEB128(-0x2001); 1501 EXPECT_TRUE(section.GetContents(&contents)); 1502 EXPECT_EQ(string("\xff\xbf\x7f", 3), contents); 1503 } 1504 1505 TEST_F(Append,ULEB128_0) { 1506 section.ULEB128(0); 1507 EXPECT_TRUE(section.GetContents(&contents)); 1508 EXPECT_EQ(string("\0", 1), contents); 1509 } 1510 1511 TEST_F(Append,ULEB128_1) { 1512 section.ULEB128(1); 1513 EXPECT_TRUE(section.GetContents(&contents)); 1514 EXPECT_EQ(string("\x01", 1), contents); 1515 } 1516 1517 TEST_F(Append,ULEB128_0x3f) { 1518 section.ULEB128(0x3f); 1519 EXPECT_TRUE(section.GetContents(&contents)); 1520 EXPECT_EQ(string("\x3f", 1), contents); 1521 } 1522 1523 TEST_F(Append,ULEB128_0x40) { 1524 section.ULEB128(0x40); 1525 EXPECT_TRUE(section.GetContents(&contents)); 1526 EXPECT_EQ(string("\x40", 1), contents); 1527 } 1528 1529 TEST_F(Append,ULEB128_0x7f) { 1530 section.ULEB128(0x7f); 1531 EXPECT_TRUE(section.GetContents(&contents)); 1532 EXPECT_EQ(string("\x7f", 1), contents); 1533 } 1534 1535 TEST_F(Append,ULEB128_0x80) { 1536 section.ULEB128(0x80); 1537 EXPECT_TRUE(section.GetContents(&contents)); 1538 EXPECT_EQ(string("\x80\x01", 2), contents); 1539 } 1540 1541 TEST_F(Append,ULEB128_0xff) { 1542 section.ULEB128(0xff); 1543 EXPECT_TRUE(section.GetContents(&contents)); 1544 EXPECT_EQ(string("\xff\x01", 2), contents); 1545 } 1546 1547 TEST_F(Append,ULEB128_0x100) { 1548 section.ULEB128(0x100); 1549 EXPECT_TRUE(section.GetContents(&contents)); 1550 EXPECT_EQ(string("\x80\x02", 2), contents); 1551 } 1552 1553 TEST_F(Append,ULEB128_0x1fff) { 1554 section.ULEB128(0x1fff); 1555 EXPECT_TRUE(section.GetContents(&contents)); 1556 EXPECT_EQ(string("\xff\x3f", 2), contents); 1557 } 1558 1559 TEST_F(Append,ULEB128_0x2000) { 1560 section.ULEB128(0x2000); 1561 EXPECT_TRUE(section.GetContents(&contents)); 1562 EXPECT_EQ(string("\x80\x40", 2), contents); 1563 } 1564 1565 TEST_F(Append,ULEB128_0x3fff) { 1566 section.ULEB128(0x3fff); 1567 EXPECT_TRUE(section.GetContents(&contents)); 1568 EXPECT_EQ(string("\xff\x7f", 2), contents); 1569 } 1570 1571 TEST_F(Append,ULEB128_0x4000) { 1572 section.ULEB128(0x4000); 1573 EXPECT_TRUE(section.GetContents(&contents)); 1574 EXPECT_EQ(string("\x80\x80\x01", 3), contents); 1575 } 1576 1577 TEST_F(Append,ULEB128_12857) { 1578 section.ULEB128(12857); 1579 EXPECT_TRUE(section.GetContents(&contents)); 1580 EXPECT_EQ(string("\xb9\x64", 2), contents); 1581 } 1582 1583 TEST_F(Append, LEBChain) { 1584 section.LEB128(-0x80).ULEB128(12857).Append("*"); 1585 EXPECT_TRUE(section.GetContents(&contents)); 1586 EXPECT_EQ(string("\x80\x7f\xb9\x64*", 5), contents); 1587 } 1588 1589 1590 class GetContents: public SectionFixture, public Test { }; 1591 1592 TEST_F(GetContents, Undefined) { 1593 Label l; 1594 section.Append(kLittleEndian, 8, l); 1595 ASSERT_FALSE(section.GetContents(&contents)); 1596 } 1597 1598 TEST_F(GetContents, ClearsContents) { 1599 section.Append((size_t) 10, '*'); 1600 EXPECT_EQ(10U, section.Size()); 1601 EXPECT_TRUE(section.GetContents(&contents)); 1602 EXPECT_EQ(0U, section.Size()); 1603 } 1604 1605 TEST_F(GetContents, ClearsReferences) { 1606 Label l; 1607 section.Append(kBigEndian, 1, l); 1608 l = 42; 1609 ASSERT_TRUE(section.GetContents(&contents)); 1610 ASSERT_BYTES(contents, I1(42)); 1611 ASSERT_TRUE(section.GetContents(&contents)); // should not die 1612 } 1613 1614 class Miscellanea: public SectionFixture, public Test { }; 1615 1616 TEST_F(Miscellanea, Clear) { 1617 section.Append("howdy"); 1618 Label l; 1619 section.L32(l); 1620 EXPECT_EQ(9U, section.Size()); 1621 section.Clear(); 1622 EXPECT_EQ(0U, section.Size()); 1623 l = 0x8d231bf0U; 1624 ASSERT_TRUE(section.GetContents(&contents)); // should not die 1625 } 1626 1627 TEST_F(Miscellanea, Align) { 1628 section.Append("*"); 1629 EXPECT_EQ(1U, section.Size()); 1630 section.Align(4).Append("*"); 1631 EXPECT_EQ(5U, section.Size()); 1632 section.Append("*").Align(2); 1633 EXPECT_EQ(6U, section.Size()); 1634 } 1635 1636 TEST_F(Miscellanea, AlignPad) { 1637 section.Append("*"); 1638 EXPECT_EQ(1U, section.Size()); 1639 section.Align(4, ' ').Append("*"); 1640 EXPECT_EQ(5U, section.Size()); 1641 section.Append("*").Align(2, ' '); 1642 EXPECT_EQ(6U, section.Size()); 1643 ASSERT_TRUE(section.GetContents(&contents)); 1644 ASSERT_EQ(string("* **"), contents); 1645 } 1646 1647 TEST_F(Miscellanea, StartHereMark) { 1648 Label m; 1649 section.Append(42, ' ').Mark(&m).Append(13, '+'); 1650 EXPECT_EQ(42U, m - section.start()); 1651 EXPECT_EQ(42U + 13U, section.Here() - section.start()); 1652 EXPECT_FALSE(section.start().IsKnownConstant()); 1653 EXPECT_FALSE(m.IsKnownConstant()); 1654 EXPECT_FALSE(section.Here().IsKnownConstant()); 1655 } 1656 1657 TEST_F(Miscellanea, Endianness) { 1658 section.set_endianness(kBigEndian); 1659 EXPECT_EQ(kBigEndian, section.endianness()); 1660 section.set_endianness(kLittleEndian); 1661 EXPECT_EQ(kLittleEndian, section.endianness()); 1662 } 1663