/*
|
* Copyright (C) 2016 The Android Open Source Project
|
*
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
* you may not use this file except in compliance with the License.
|
* You may obtain a copy of the License at
|
*
|
* http://www.apache.org/licenses/LICENSE-2.0
|
*
|
* Unless required by applicable law or agreed to in writing, software
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* See the License for the specific language governing permissions and
|
* limitations under the License.
|
*/
|
|
#include "compiler_filter.h"
|
|
#include <ostream>
|
|
#include "base/utils.h"
|
|
namespace art {
|
|
bool CompilerFilter::IsAotCompilationEnabled(Filter filter) {
|
switch (filter) {
|
case CompilerFilter::kAssumeVerified:
|
case CompilerFilter::kExtract:
|
case CompilerFilter::kVerify:
|
case CompilerFilter::kQuicken: return false;
|
|
case CompilerFilter::kSpaceProfile:
|
case CompilerFilter::kSpace:
|
case CompilerFilter::kSpeedProfile:
|
case CompilerFilter::kSpeed:
|
case CompilerFilter::kEverythingProfile:
|
case CompilerFilter::kEverything: return true;
|
}
|
UNREACHABLE();
|
}
|
|
bool CompilerFilter::IsJniCompilationEnabled(Filter filter) {
|
switch (filter) {
|
case CompilerFilter::kAssumeVerified:
|
case CompilerFilter::kExtract:
|
case CompilerFilter::kVerify: return false;
|
|
case CompilerFilter::kQuicken:
|
case CompilerFilter::kSpaceProfile:
|
case CompilerFilter::kSpace:
|
case CompilerFilter::kSpeedProfile:
|
case CompilerFilter::kSpeed:
|
case CompilerFilter::kEverythingProfile:
|
case CompilerFilter::kEverything: return true;
|
}
|
UNREACHABLE();
|
}
|
|
bool CompilerFilter::IsQuickeningCompilationEnabled(Filter filter) {
|
switch (filter) {
|
case CompilerFilter::kAssumeVerified:
|
case CompilerFilter::kExtract:
|
case CompilerFilter::kVerify: return false;
|
|
case CompilerFilter::kQuicken:
|
case CompilerFilter::kSpaceProfile:
|
case CompilerFilter::kSpace:
|
case CompilerFilter::kSpeedProfile:
|
case CompilerFilter::kSpeed:
|
case CompilerFilter::kEverythingProfile:
|
case CompilerFilter::kEverything: return true;
|
}
|
UNREACHABLE();
|
}
|
|
bool CompilerFilter::IsAnyCompilationEnabled(Filter filter) {
|
return IsJniCompilationEnabled(filter) ||
|
IsQuickeningCompilationEnabled(filter) ||
|
IsAotCompilationEnabled(filter);
|
}
|
|
bool CompilerFilter::IsVerificationEnabled(Filter filter) {
|
switch (filter) {
|
case CompilerFilter::kAssumeVerified:
|
case CompilerFilter::kExtract: return false;
|
|
case CompilerFilter::kVerify:
|
case CompilerFilter::kQuicken:
|
case CompilerFilter::kSpaceProfile:
|
case CompilerFilter::kSpace:
|
case CompilerFilter::kSpeedProfile:
|
case CompilerFilter::kSpeed:
|
case CompilerFilter::kEverythingProfile:
|
case CompilerFilter::kEverything: return true;
|
}
|
UNREACHABLE();
|
}
|
|
bool CompilerFilter::DependsOnImageChecksum(Filter filter) {
|
// We run dex2dex with verification, so the oat file will depend on the
|
// image checksum if verification is enabled.
|
return IsVerificationEnabled(filter);
|
}
|
|
bool CompilerFilter::DependsOnProfile(Filter filter) {
|
switch (filter) {
|
case CompilerFilter::kAssumeVerified:
|
case CompilerFilter::kExtract:
|
case CompilerFilter::kVerify:
|
case CompilerFilter::kQuicken:
|
case CompilerFilter::kSpace:
|
case CompilerFilter::kSpeed:
|
case CompilerFilter::kEverything: return false;
|
|
case CompilerFilter::kSpaceProfile:
|
case CompilerFilter::kSpeedProfile:
|
case CompilerFilter::kEverythingProfile: return true;
|
}
|
UNREACHABLE();
|
}
|
|
CompilerFilter::Filter CompilerFilter::GetNonProfileDependentFilterFrom(Filter filter) {
|
switch (filter) {
|
case CompilerFilter::kAssumeVerified:
|
case CompilerFilter::kExtract:
|
case CompilerFilter::kVerify:
|
case CompilerFilter::kQuicken:
|
case CompilerFilter::kSpace:
|
case CompilerFilter::kSpeed:
|
case CompilerFilter::kEverything:
|
return filter;
|
|
case CompilerFilter::kSpaceProfile:
|
return CompilerFilter::kSpace;
|
|
case CompilerFilter::kSpeedProfile:
|
return CompilerFilter::kSpeed;
|
|
case CompilerFilter::kEverythingProfile:
|
return CompilerFilter::kEverything;
|
}
|
UNREACHABLE();
|
}
|
|
CompilerFilter::Filter CompilerFilter::GetSafeModeFilterFrom(Filter filter) {
|
// For safe mode, we should not return a filter that generates AOT compiled
|
// code.
|
switch (filter) {
|
case CompilerFilter::kAssumeVerified:
|
case CompilerFilter::kExtract:
|
case CompilerFilter::kVerify:
|
case CompilerFilter::kQuicken:
|
return filter;
|
|
case CompilerFilter::kSpace:
|
case CompilerFilter::kSpeed:
|
case CompilerFilter::kEverything:
|
case CompilerFilter::kSpaceProfile:
|
case CompilerFilter::kSpeedProfile:
|
case CompilerFilter::kEverythingProfile:
|
return CompilerFilter::kQuicken;
|
}
|
UNREACHABLE();
|
}
|
|
bool CompilerFilter::IsAsGoodAs(Filter current, Filter target) {
|
return current >= target;
|
}
|
|
bool CompilerFilter::IsBetter(Filter current, Filter target) {
|
return current > target;
|
}
|
|
std::string CompilerFilter::NameOfFilter(Filter filter) {
|
switch (filter) {
|
case CompilerFilter::kAssumeVerified: return "assume-verified";
|
case CompilerFilter::kExtract: return "extract";
|
case CompilerFilter::kVerify: return "verify";
|
case CompilerFilter::kQuicken: return "quicken";
|
case CompilerFilter::kSpaceProfile: return "space-profile";
|
case CompilerFilter::kSpace: return "space";
|
case CompilerFilter::kSpeedProfile: return "speed-profile";
|
case CompilerFilter::kSpeed: return "speed";
|
case CompilerFilter::kEverythingProfile: return "everything-profile";
|
case CompilerFilter::kEverything: return "everything";
|
}
|
UNREACHABLE();
|
}
|
|
bool CompilerFilter::ParseCompilerFilter(const char* option, Filter* filter) {
|
CHECK(filter != nullptr);
|
|
if (strcmp(option, "verify-none") == 0) {
|
LOG(WARNING) << "'verify-none' is an obsolete compiler filter name that will be "
|
<< "removed in future releases, please use 'assume-verified' instead.";
|
*filter = kAssumeVerified;
|
} else if (strcmp(option, "interpret-only") == 0) {
|
LOG(WARNING) << "'interpret-only' is an obsolete compiler filter name that will be "
|
<< "removed in future releases, please use 'quicken' instead.";
|
*filter = kQuicken;
|
} else if (strcmp(option, "verify-profile") == 0) {
|
LOG(WARNING) << "'verify-profile' is an obsolete compiler filter name that will be "
|
<< "removed in future releases, please use 'verify' instead.";
|
*filter = kVerify;
|
} else if (strcmp(option, "verify-at-runtime") == 0) {
|
LOG(WARNING) << "'verify-at-runtime' is an obsolete compiler filter name that will be "
|
<< "removed in future releases, please use 'extract' instead.";
|
*filter = kExtract;
|
} else if (strcmp(option, "balanced") == 0) {
|
LOG(WARNING) << "'balanced' is an obsolete compiler filter name that will be "
|
<< "removed in future releases, please use 'speed' instead.";
|
*filter = kSpeed;
|
} else if (strcmp(option, "time") == 0) {
|
LOG(WARNING) << "'time' is an obsolete compiler filter name that will be "
|
<< "removed in future releases, please use 'space' instead.";
|
*filter = kSpace;
|
} else if (strcmp(option, "assume-verified") == 0) {
|
*filter = kAssumeVerified;
|
} else if (strcmp(option, "extract") == 0) {
|
*filter = kExtract;
|
} else if (strcmp(option, "verify") == 0) {
|
*filter = kVerify;
|
} else if (strcmp(option, "quicken") == 0) {
|
*filter = kQuicken;
|
} else if (strcmp(option, "space") == 0) {
|
*filter = kSpace;
|
} else if (strcmp(option, "space-profile") == 0) {
|
*filter = kSpaceProfile;
|
} else if (strcmp(option, "speed") == 0) {
|
*filter = kSpeed;
|
} else if (strcmp(option, "speed-profile") == 0) {
|
*filter = kSpeedProfile;
|
} else if (strcmp(option, "everything") == 0) {
|
*filter = kEverything;
|
} else if (strcmp(option, "everything-profile") == 0) {
|
*filter = kEverythingProfile;
|
} else {
|
return false;
|
}
|
return true;
|
}
|
|
std::ostream& operator<<(std::ostream& os, const CompilerFilter::Filter& rhs) {
|
return os << CompilerFilter::NameOfFilter(rhs);
|
}
|
|
} // namespace art
|