//===-- XRayLists.cpp - XRay automatic-attribution ------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// User-provided filters for always/never XRay instrumenting certain functions.
//
//===----------------------------------------------------------------------===//
#include "clang/Basic/XRayLists.h"

using namespace clang;

XRayFunctionFilter::XRayFunctionFilter(
    ArrayRef<std::string> AlwaysInstrumentPaths,
    ArrayRef<std::string> NeverInstrumentPaths,
    ArrayRef<std::string> AttrListPaths, SourceManager &SM)
    : AlwaysInstrument(
          llvm::SpecialCaseList::createOrDie(AlwaysInstrumentPaths)),
      NeverInstrument(llvm::SpecialCaseList::createOrDie(NeverInstrumentPaths)),
      AttrList(llvm::SpecialCaseList::createOrDie(AttrListPaths)), SM(SM) {}

XRayFunctionFilter::ImbueAttribute
XRayFunctionFilter::shouldImbueFunction(StringRef FunctionName) const {
  // First apply the always instrument list, than if it isn't an "always" see
  // whether it's treated as a "never" instrument function.
  // TODO: Remove these as they're deprecated; use the AttrList exclusively.
  if (AlwaysInstrument->inSection("xray_always_instrument", "fun", FunctionName,
                                  "arg1") ||
      AttrList->inSection("always", "fun", FunctionName, "arg1"))
    return ImbueAttribute::ALWAYS_ARG1;
  if (AlwaysInstrument->inSection("xray_always_instrument", "fun",
                                  FunctionName) ||
      AttrList->inSection("always", "fun", FunctionName))
    return ImbueAttribute::ALWAYS;

  if (NeverInstrument->inSection("xray_never_instrument", "fun",
                                 FunctionName) ||
      AttrList->inSection("never", "fun", FunctionName))
    return ImbueAttribute::NEVER;

  return ImbueAttribute::NONE;
}

XRayFunctionFilter::ImbueAttribute
XRayFunctionFilter::shouldImbueFunctionsInFile(StringRef Filename,
                                               StringRef Category) const {
  if (AlwaysInstrument->inSection("xray_always_instrument", "src", Filename,
                                  Category) ||
      AttrList->inSection("always", "src", Filename, Category))
    return ImbueAttribute::ALWAYS;
  if (NeverInstrument->inSection("xray_never_instrument", "src", Filename,
                                 Category) ||
      AttrList->inSection("never", "src", Filename, Category))
    return ImbueAttribute::NEVER;
  return ImbueAttribute::NONE;
}

XRayFunctionFilter::ImbueAttribute
XRayFunctionFilter::shouldImbueLocation(SourceLocation Loc,
                                        StringRef Category) const {
  if (!Loc.isValid())
    return ImbueAttribute::NONE;
  return this->shouldImbueFunctionsInFile(SM.getFilename(SM.getFileLoc(Loc)),
                                          Category);
}
