2023-04-17 19:13:59 +01:00
|
|
|
/*
|
|
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
|
|
*
|
|
|
|
* 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 "Features.h"
|
|
|
|
|
|
|
|
#include <map>
|
2023-07-03 16:02:51 +01:00
|
|
|
#include <numeric>
|
|
|
|
#include <stdexcept>
|
2023-04-17 19:13:59 +01:00
|
|
|
|
|
|
|
namespace ObjectIntrospection {
|
2023-07-03 16:02:51 +01:00
|
|
|
namespace {
|
|
|
|
|
|
|
|
std::string_view featureHelp(Feature f) {
|
|
|
|
switch (f) {
|
|
|
|
case Feature::ChaseRawPointers:
|
|
|
|
return "Chase raw pointers in the probed object.";
|
|
|
|
case Feature::PackStructs:
|
|
|
|
return "Pack structs.";
|
|
|
|
case Feature::GenPaddingStats:
|
|
|
|
return "Generate statistics on padding of structures.";
|
|
|
|
case Feature::CaptureThriftIsset:
|
|
|
|
return "Capture isset data for Thrift object.";
|
|
|
|
case Feature::TypeGraph:
|
2023-07-03 13:18:25 +01:00
|
|
|
return "Use Type Graph for code generation (CodeGen v2).";
|
2023-07-03 16:02:51 +01:00
|
|
|
case Feature::TypedDataSegment:
|
|
|
|
return "Use Typed Data Segment in generated code.";
|
2023-07-03 13:18:25 +01:00
|
|
|
case Feature::TreeBuilderV2:
|
|
|
|
return "Use Tree Builder v2 for reading the data segment";
|
2023-07-03 16:02:51 +01:00
|
|
|
case Feature::GenJitDebug:
|
|
|
|
return "Generate debug information for the JIT object.";
|
|
|
|
case Feature::JitLogging:
|
|
|
|
return "Log information from the JIT code for debugging.";
|
|
|
|
case Feature::PolymorphicInheritance:
|
|
|
|
return "Follow polymorphic inheritance hierarchies in the probed object.";
|
2023-06-22 17:27:21 +01:00
|
|
|
case Feature::JitTiming:
|
|
|
|
return "Instrument the JIT code with timing for performance testing.";
|
2023-07-03 16:02:51 +01:00
|
|
|
|
|
|
|
case Feature::UnknownFeature:
|
|
|
|
throw std::runtime_error("should not ask for help for UnknownFeature!");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace
|
2023-04-17 19:13:59 +01:00
|
|
|
|
|
|
|
Feature featureFromStr(std::string_view str) {
|
|
|
|
static const std::map<std::string_view, Feature> nameMap = {
|
|
|
|
#define X(name, str) {str, Feature::name},
|
|
|
|
OI_FEATURE_LIST
|
|
|
|
#undef X
|
|
|
|
};
|
|
|
|
|
|
|
|
if (auto search = nameMap.find(str); search != nameMap.end()) {
|
|
|
|
return search->second;
|
|
|
|
}
|
|
|
|
return Feature::UnknownFeature;
|
|
|
|
}
|
|
|
|
|
|
|
|
const char* featureToStr(Feature f) {
|
|
|
|
switch (f) {
|
|
|
|
#define X(name, str) \
|
|
|
|
case Feature::name: \
|
|
|
|
return str;
|
|
|
|
OI_FEATURE_LIST
|
|
|
|
#undef X
|
|
|
|
|
|
|
|
default:
|
|
|
|
return "UnknownFeature";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-07-03 16:02:51 +01:00
|
|
|
void featuresHelp(std::ostream& out) {
|
|
|
|
out << "FEATURES SUMMARY" << std::endl;
|
|
|
|
|
|
|
|
size_t longestName = std::accumulate(
|
|
|
|
allFeatures.begin(), allFeatures.end(), 0, [](size_t acc, Feature f) {
|
|
|
|
return std::max(acc, std::string_view(featureToStr(f)).size());
|
|
|
|
});
|
|
|
|
|
|
|
|
for (Feature f : allFeatures) {
|
|
|
|
std::string_view name(featureToStr(f));
|
|
|
|
|
|
|
|
out << " " << name << std::string(longestName - name.size() + 2, ' ')
|
|
|
|
<< featureHelp(f) << std::endl;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-04-17 19:13:59 +01:00
|
|
|
} // namespace ObjectIntrospection
|