| Index: src/IceTargetLowering.cpp
|
| diff --git a/src/IceTargetLowering.cpp b/src/IceTargetLowering.cpp
|
| index 6f104fea8b3d2d69cde50e5d27606f5ae15f68c5..94c8ecce9f5ea3c2eebec961b1d973785a8b6f6e 100644
|
| --- a/src/IceTargetLowering.cpp
|
| +++ b/src/IceTargetLowering.cpp
|
| @@ -56,6 +56,7 @@
|
| std::unique_ptr<::Ice::TargetHeaderLowering> \
|
| createTargetHeaderLowering(::Ice::GlobalContext *Ctx); \
|
| void staticInit(::Ice::GlobalContext *Ctx); \
|
| + bool shouldBePooled(const ::Ice::Constant *C); \
|
| } // end of namespace X
|
| #include "SZTargets.def"
|
| #undef SUBZERO_TARGET
|
| @@ -125,8 +126,8 @@ Variable *LoweringContext::availabilityGet(Operand *Src) const {
|
| namespace {
|
|
|
| void printRegisterSet(Ostream &Str, const SmallBitVector &Bitset,
|
| - std::function<IceString(RegNumT)> getRegName,
|
| - const IceString &LineIndentString) {
|
| + std::function<std::string(RegNumT)> getRegName,
|
| + const std::string &LineIndentString) {
|
| constexpr size_t RegistersPerLine = 16;
|
| size_t Count = 0;
|
| for (RegNumT RegNum : RegNumBVIter(Bitset)) {
|
| @@ -146,8 +147,8 @@ void printRegisterSet(Ostream &Str, const SmallBitVector &Bitset,
|
|
|
| // Splits "<class>:<reg>" into "<class>" plus "<reg>". If there is no <class>
|
| // component, the result is "" plus "<reg>".
|
| -void splitToClassAndName(const IceString &RegName, IceString *SplitRegClass,
|
| - IceString *SplitRegName) {
|
| +void splitToClassAndName(const std::string &RegName, std::string *SplitRegClass,
|
| + std::string *SplitRegName) {
|
| constexpr const char Separator[] = ":";
|
| constexpr size_t SeparatorWidth = llvm::array_lengthof(Separator) - 1;
|
| size_t Pos = RegName.find(Separator);
|
| @@ -169,14 +170,15 @@ LLVM_ATTRIBUTE_NORETURN void badTargetFatalError(TargetArch Target) {
|
|
|
| void TargetLowering::filterTypeToRegisterSet(
|
| GlobalContext *Ctx, int32_t NumRegs, SmallBitVector TypeToRegisterSet[],
|
| - size_t TypeToRegisterSetSize, std::function<IceString(RegNumT)> getRegName,
|
| - std::function<IceString(RegClass)> getRegClassName) {
|
| + size_t TypeToRegisterSetSize,
|
| + std::function<std::string(RegNumT)> getRegName,
|
| + std::function<const char *(RegClass)> getRegClassName) {
|
| std::vector<SmallBitVector> UseSet(TypeToRegisterSetSize,
|
| SmallBitVector(NumRegs));
|
| std::vector<SmallBitVector> ExcludeSet(TypeToRegisterSetSize,
|
| SmallBitVector(NumRegs));
|
|
|
| - std::unordered_map<IceString, RegNumT> RegNameToIndex;
|
| + std::unordered_map<std::string, RegNumT> RegNameToIndex;
|
| for (int32_t RegIndex = 0; RegIndex < NumRegs; ++RegIndex) {
|
| const auto RegNum = RegNumT::fromInt(RegIndex);
|
| RegNameToIndex[getRegName(RegNum)] = RegNum;
|
| @@ -191,9 +193,9 @@ void TargetLowering::filterTypeToRegisterSet(
|
| // for all classes.
|
| auto processRegList = [&](const std::vector<std::string> &RegNames,
|
| std::vector<SmallBitVector> &RegSet) {
|
| - for (const IceString &RegClassAndName : RegNames) {
|
| - IceString RClass;
|
| - IceString RName;
|
| + for (const std::string &RegClassAndName : RegNames) {
|
| + std::string RClass;
|
| + std::string RName;
|
| splitToClassAndName(RegClassAndName, &RClass, &RName);
|
| if (!RegNameToIndex.count(RName)) {
|
| BadRegNames.push_back(RName);
|
| @@ -236,8 +238,8 @@ void TargetLowering::filterTypeToRegisterSet(
|
| if (BuildDefs::dump() && NumRegs &&
|
| (Ctx->getFlags().getVerbose() & IceV_AvailableRegs)) {
|
| Ostream &Str = Ctx->getStrDump();
|
| - const IceString Indent = " ";
|
| - const IceString IndentTwice = Indent + Indent;
|
| + const std::string Indent = " ";
|
| + const std::string IndentTwice = Indent + Indent;
|
| Str << "Registers available for register allocation:\n";
|
| for (size_t TypeIndex = 0; TypeIndex < TypeToRegisterSetSize; ++TypeIndex) {
|
| Str << Indent << getRegClassName(static_cast<RegClass>(TypeIndex))
|
| @@ -282,6 +284,19 @@ void TargetLowering::staticInit(GlobalContext *Ctx) {
|
| }
|
| }
|
|
|
| +bool TargetLowering::shouldBePooled(const Constant *C) {
|
| + const TargetArch Target = GlobalContext::getFlags().getTargetArch();
|
| + switch (Target) {
|
| + default:
|
| + return false;
|
| +#define SUBZERO_TARGET(X) \
|
| + case TARGET_LOWERING_CLASS_FOR(X): \
|
| + return ::X::shouldBePooled(C);
|
| +#include "SZTargets.def"
|
| +#undef SUBZERO_TARGET
|
| + }
|
| +}
|
| +
|
| TargetLowering::SandboxType
|
| TargetLowering::determineSandboxTypeFromFlags(const ClFlags &Flags) {
|
| assert(!Flags.getUseSandboxing() || !Flags.getUseNonsfi());
|
| @@ -728,7 +743,7 @@ void TargetLowering::emitWithoutPrefix(const ConstantRelocatable *C,
|
| if (!BuildDefs::dump())
|
| return;
|
| Ostream &Str = Ctx->getStrEmit();
|
| - const IceString &EmitStr = C->getEmitString();
|
| + const std::string &EmitStr = C->getEmitString();
|
| if (!EmitStr.empty()) {
|
| // C has a custom emit string, so we use it instead of the canonical
|
| // Name + Offset form.
|
| @@ -765,8 +780,9 @@ namespace {
|
| // dataSectionSuffix decides whether to use SectionSuffix or VarName as data
|
| // section suffix. Essentially, when using separate data sections for globals
|
| // SectionSuffix is not necessary.
|
| -IceString dataSectionSuffix(const IceString &SectionSuffix,
|
| - const IceString &VarName, const bool DataSections) {
|
| +std::string dataSectionSuffix(const std::string &SectionSuffix,
|
| + const std::string &VarName,
|
| + const bool DataSections) {
|
| if (SectionSuffix.empty() && !DataSections) {
|
| return "";
|
| }
|
| @@ -783,7 +799,7 @@ IceString dataSectionSuffix(const IceString &SectionSuffix,
|
| } // end of anonymous namespace
|
|
|
| void TargetDataLowering::emitGlobal(const VariableDeclaration &Var,
|
| - const IceString &SectionSuffix) {
|
| + const std::string &SectionSuffix) {
|
| if (!BuildDefs::dump())
|
| return;
|
|
|
| @@ -798,13 +814,13 @@ void TargetDataLowering::emitGlobal(const VariableDeclaration &Var,
|
| const bool HasNonzeroInitializer = Var.hasNonzeroInitializer();
|
| const bool IsConstant = Var.getIsConstant();
|
| const SizeT Size = Var.getNumBytes();
|
| - const IceString &Name = Var.getName();
|
| + const std::string Name = Var.getName().toString();
|
|
|
| Str << "\t.type\t" << Name << ",%object\n";
|
|
|
| const bool UseDataSections = Ctx->getFlags().getDataSections();
|
| const bool UseNonsfi = Ctx->getFlags().getUseNonsfi();
|
| - const IceString Suffix =
|
| + const std::string Suffix =
|
| dataSectionSuffix(SectionSuffix, Name, UseDataSections);
|
| if (IsConstant && UseNonsfi)
|
| Str << "\t.section\t.data.rel.ro" << Suffix << ",\"aw\",%progbits\n";
|
|
|