dex2oat: add --cpu-set command-line option

Enables affinitizing dex2oat threads to a specific group of CPUs.

Bug: 141446571
Test: art/test/run-test -Xcompiler-option --cpu-set=0,1 956
Test: art/test/run-test -Xcompiler-option --cpu-set=,0,1 956
Test: art/test/run-test -Xcompiler-option --cpu-set=,, 956
Test: art/test/run-test -Xcompiler-option --cpu-set=0,a 956
Test: cmdline_parser_test
Change-Id: I4bb1519beacd329da1a69af31982a6154d315865
diff --git a/cmdline/cmdline_parser_test.cc b/cmdline/cmdline_parser_test.cc
index 052d9ec..49e0a4f 100644
--- a/cmdline/cmdline_parser_test.cc
+++ b/cmdline/cmdline_parser_test.cc
@@ -20,7 +20,6 @@
 
 #include "gtest/gtest.h"
 
-#include "base/mutex.h"
 #include "base/utils.h"
 #include "jdwp_provider.h"
 #include "experimental_flags.h"
@@ -579,4 +578,21 @@
   EXPECT_KEY_VALUE(map, M::MethodTrace, Unit{});
   EXPECT_KEY_VALUE(map, M::LargeObjectSpace, gc::space::LargeObjectSpaceType::kMap);
 }  //  TEST_F
+
+TEST_F(CmdlineParserTest, TypesNotInRuntime) {
+  CmdlineType<std::vector<int32_t>> ct;
+  auto success0 =
+      CmdlineParseResult<std::vector<int32_t>>::Success(std::vector<int32_t>({1, 2, 3, 4}));
+  EXPECT_EQ(success0, ct.Parse("1,2,3,4"));
+  auto success1 = CmdlineParseResult<std::vector<int32_t>>::Success(std::vector<int32_t>({0}));
+  EXPECT_EQ(success1, ct.Parse("1"));
+
+  EXPECT_FALSE(ct.Parse("").IsSuccess());
+  EXPECT_FALSE(ct.Parse(",").IsSuccess());
+  EXPECT_FALSE(ct.Parse("1,").IsSuccess());
+  EXPECT_FALSE(ct.Parse(",1").IsSuccess());
+  EXPECT_FALSE(ct.Parse("1a2").IsSuccess());
+  EXPECT_EQ(CmdlineResult::kOutOfRange, ct.Parse("1,10000000000000").GetStatus());
+  EXPECT_EQ(CmdlineResult::kOutOfRange, ct.Parse("-10000000000000,123").GetStatus());
+}  // TEST_F
 }  // namespace art