r239579 - Add support for the the target attribute.

Justin Bogner mail at justinbogner.com
Mon Jul 6 10:22:56 PDT 2015


Eric Christopher <echristo at gmail.com> writes:
> Author: echristo
> Date: Thu Jun 11 20:35:52 2015
> New Revision: 239579
>
> URL: http://llvm.org/viewvc/llvm-project?rev=239579&view=rev
> Log:
> Add support for the the target attribute.
>
> Modeled after the gcc attribute of the same name, this feature
> allows source level annotations to correspond to backend code
> generation. In llvm particular parlance, this allows the adding
> of subtarget features and changing the cpu for a particular function
> based on source level hints.
>
> This has been added into the existing support for function level
> attributes without particular verification for any target outside
> of whether or not the backend will support the features/cpu given
> (similar to section, etc).
>
> Added:
>     cfe/trunk/test/CodeGen/attr-target.c
>     cfe/trunk/test/Sema/attr-target.c
> Modified:
>     cfe/trunk/include/clang/Basic/Attr.td
>     cfe/trunk/lib/CodeGen/CGCall.cpp
>     cfe/trunk/lib/Sema/SemaDeclAttr.cpp
>
> Modified: cfe/trunk/include/clang/Basic/Attr.td
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Attr.td?rev=239579&r1=239578&r2=239579&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/Attr.td (original)
> +++ cfe/trunk/include/clang/Basic/Attr.td Thu Jun 11 20:35:52 2015
> @@ -1250,6 +1250,14 @@ def Pascal : InheritableAttr {
>    let Documentation = [Undocumented];
>  }
>  
> +def Target : InheritableAttr {
> +  let Spellings = [GCC<"target">];
> +  let Args = [StringArgument<"features">];
> +  let Subjects =
> +      SubjectList<[Function], ErrorDiag, "ExpectedFunctionMethodOrClass">;
> +  let Documentation = [Undocumented];

Best to avoid "Undocumented" for new attributes. Please add some docs to
AttrDocs.td (lots of examples of how to do that there).

> +}
> +
>  def TransparentUnion : InheritableAttr {
>    let Spellings = [GCC<"transparent_union">];
>  //  let Subjects = SubjectList<[Record, TypedefName]>;
>
> Modified: cfe/trunk/lib/CodeGen/CGCall.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.cpp?rev=239579&r1=239578&r2=239579&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGCall.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGCall.cpp Thu Jun 11 20:35:52 2015
> @@ -1483,24 +1483,52 @@ void CodeGenModule::ConstructAttributeLi
>      if (!CodeGenOpts.StackRealignment)
>        FuncAttrs.addAttribute("no-realign-stack");
>  
> -    // Add target-cpu and target-features work if they differ from the defaults.
> -    std::string &CPU = getTarget().getTargetOpts().CPU;
> -    if (CPU != "")
> -      FuncAttrs.addAttribute("target-cpu", CPU);
> +    // Add target-cpu and target-features attributes to functions. If
> +    // we have a decl for the function and it has a target attribute then
> +    // parse that and add it to the feature set.
> +    StringRef TargetCPU = getTarget().getTargetOpts().CPU;
>  
>      // TODO: Features gets us the features on the command line including
>      // feature dependencies. For canonicalization purposes we might want to
> -    // avoid putting features in the target-features set if we know it'll be one
> -    // of the default features in the backend, e.g. corei7-avx and +avx or figure
> -    // out non-explicit dependencies.
> -    std::vector<std::string> &Features = getTarget().getTargetOpts().Features;
> +    // avoid putting features in the target-features set if we know it'll be
> +    // one of the default features in the backend, e.g. corei7-avx and +avx or
> +    // figure out non-explicit dependencies.
> +    std::vector<std::string> Features(getTarget().getTargetOpts().Features);
> +
> +    // TODO: The target attribute complicates this further by allowing multiple
> +    // additional features to be tacked on to the feature string for a
> +    // particular function. For now we simply append to the set of features and
> +    // let backend resolution fix them up.
> +    const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(TargetDecl);
> +    if (FD) {
> +      if (const TargetAttr *TD = FD->getAttr<TargetAttr>()) {
> +        StringRef FeaturesStr = TD->getFeatures();
> +        SmallVector<StringRef, 1> AttrFeatures;
> +        FeaturesStr.split(AttrFeatures, ",");
> +
> +        // Grab the various features and prepend a "+" to turn on the feature to
> +        // the backend and add them to our existing set of Features.
> +        for (auto &Feature : AttrFeatures) {
> +          // While we're here iterating check for a different target cpu.
> +          if (Feature.startswith("arch="))
> +            TargetCPU = Feature.split("=").second;
> +	  else
> +	    Features.push_back("+" + Feature.str());
> +	}
> +      }
> +    }
> +
> +    // Now add the target-cpu and target-features to the function.
> +    if (TargetCPU != "")
> +      FuncAttrs.addAttribute("target-cpu", TargetCPU);
>      if (!Features.empty()) {
> -      std::stringstream S;
> +      std::stringstream TargetFeatures;
>        std::copy(Features.begin(), Features.end(),
> -                std::ostream_iterator<std::string>(S, ","));
> +                std::ostream_iterator<std::string>(TargetFeatures, ","));
> +
>        // The drop_back gets rid of the trailing space.
>        FuncAttrs.addAttribute("target-features",
> -                             StringRef(S.str()).drop_back(1));
> +                             StringRef(TargetFeatures.str()).drop_back(1));
>      }
>    }
>  
>
> Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=239579&r1=239578&r2=239579&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Thu Jun 11 20:35:52 2015
> @@ -2397,6 +2397,20 @@ static void handleSectionAttr(Sema &S, D
>      D->addAttr(NewAttr);
>  }
>  
> +static void handleTargetAttr(Sema &S, Decl *D, const AttributeList &Attr) {
> +  // TODO: Validation should use a backend target library that specifies
> +  // the allowable subtarget features and cpus. We could use something like a
> +  // TargetCodeGenInfo hook here to do validation.
> +  StringRef Str;
> +  SourceLocation LiteralLoc;
> +  if (!S.checkStringLiteralArgumentAttr(Attr, 0, Str, &LiteralLoc))
> +    return;
> +  unsigned Index = Attr.getAttributeSpellingListIndex();
> +  TargetAttr *NewAttr =
> +      ::new (S.Context) TargetAttr(Attr.getRange(), S.Context, Str, Index);
> +  D->addAttr(NewAttr);
> +}
> +
>  
>  static void handleCleanupAttr(Sema &S, Decl *D, const AttributeList &Attr) {
>    VarDecl *VD = cast<VarDecl>(D);
> @@ -4716,6 +4730,9 @@ static void ProcessDeclAttribute(Sema &S
>    case AttributeList::AT_Section:
>      handleSectionAttr(S, D, Attr);
>      break;
> +  case AttributeList::AT_Target:
> +    handleTargetAttr(S, D, Attr);
> +    break;
>    case AttributeList::AT_Unavailable:
>      handleAttrWithMessage<UnavailableAttr>(S, D, Attr);
>      break;
>
> Added: cfe/trunk/test/CodeGen/attr-target.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/attr-target.c?rev=239579&view=auto
> ==============================================================================
> --- cfe/trunk/test/CodeGen/attr-target.c (added)
> +++ cfe/trunk/test/CodeGen/attr-target.c Thu Jun 11 20:35:52 2015
> @@ -0,0 +1,14 @@
> +// RUN: %clang_cc1 -triple x86_64-linux-gnu -target-cpu x86-64 -emit-llvm %s -o - | FileCheck %s
> +
> +int baz(int a) { return 4; }
> +
> +int __attribute__((target("avx,sse4.2,arch=ivybridge"))) foo(int a) { return 4; }
> +
> +int bar(int a) { return baz(a) + foo(a); }
> +
> +// Check that we emit the additional subtarget and cpu features for foo and not for baz or bar.
> +// CHECK: baz{{.*}} #0
> +// CHECK: foo{{.*}} #1
> +// CHECK: bar{{.*}} #0
> +// CHECK: #0 = {{.*}}"target-cpu"="x86-64" "target-features"="+sse,+sse2"
> +// CHECK: #1 = {{.*}}"target-cpu"="ivybridge" "target-features"="+sse,+sse2,+avx,+sse4.2"
>
> Added: cfe/trunk/test/Sema/attr-target.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/attr-target.c?rev=239579&view=auto
> ==============================================================================
> --- cfe/trunk/test/Sema/attr-target.c (added)
> +++ cfe/trunk/test/Sema/attr-target.c Thu Jun 11 20:35:52 2015
> @@ -0,0 +1,6 @@
> +// RUN: %clang_cc1 -triple x86_64-linux-gnu  -fsyntax-only -verify %s
> +
> +int __attribute__((target("avx,sse4.2,arch=ivybridge"))) foo() { return 4; }
> +int __attribute__((target())) bar() { return 4; } //expected-error {{'target' attribute takes one argument}}
> +
> +
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list