57 lines · cpp
1//===- ReduceTargetFeaturesAttr.cpp - Specialized Delta Pass --------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// Attempt to remove individual elements of the "target-features" attribute on10// functions.11//12//===----------------------------------------------------------------------===//13 14#include "ReduceTargetFeaturesAttr.h"15 16#include "llvm/ADT/SmallString.h"17#include "llvm/ADT/StringExtras.h"18#include "llvm/IR/Function.h"19 20// TODO: We could maybe do better if we did a semantic parse of the attributes21// through MCSubtargetInfo. Features can be flipped on and off in the string,22// some are implied by target-cpu and can't be meaningfully re-added.23void llvm::reduceTargetFeaturesAttrDeltaPass(Oracle &O,24 ReducerWorkItem &WorkItem) {25 Module &M = WorkItem.getModule();26 SmallString<256> NewValueString;27 SmallVector<StringRef, 32> SplitFeatures;28 29 for (Function &F : M) {30 Attribute TargetFeaturesAttr = F.getFnAttribute("target-features");31 if (!TargetFeaturesAttr.isValid())32 continue;33 34 StringRef TargetFeatures = TargetFeaturesAttr.getValueAsString();35 TargetFeatures.split(SplitFeatures, ',', /*MaxSplit=*/-1,36 /*KeepEmpty=*/false);37 38 ListSeparator LS(",");39 40 {41 raw_svector_ostream OS(NewValueString);42 for (StringRef Feature : SplitFeatures) {43 if (O.shouldKeep())44 OS << LS << Feature;45 }46 }47 48 if (NewValueString.empty())49 F.removeFnAttr("target-features");50 else51 F.addFnAttr("target-features", NewValueString);52 53 SplitFeatures.clear();54 NewValueString.clear();55 }56}57