This is an archive of the discontinued LLVM Phabricator instance.

[ARM] Add support for target("arm") and target("thumb").
ClosedPublic

Authored by fhahn on May 31 2017, 6:11 AM.

Details

Summary

This patch adds support for the target("arm") and target("thumb")
attributes, which can be used to force the compiler to generated ARM or
Thumb code for a function.

In LLVM, ARM or Thumb code generation can be controlled by the
thumb-mode target feature. But GCC already uses target("arm") and
target("thumb"), so we have to substitute "arm" with -thumb-mode and
"thumb" with +thumb-mode.

Diff Detail

Event Timeline

fhahn created this revision.May 31 2017, 6:11 AM
include/clang/Basic/Attr.td
1774 ↗(On Diff #100854)

Would this be a more accurate comment:

"...arm and thumb to thumb-mode" => "arm and thumb to arm-mode or thumb-mode, respectively"
Or
"[-|+] thumb-mode"

fhahn updated this revision to Diff 100880.May 31 2017, 9:41 AM

reworded comment and improved test case to ensure only a single thumb-mode attribute is added.

fhahn marked an inline comment as done.May 31 2017, 9:41 AM
echristo added inline comments.May 31 2017, 1:11 PM
include/clang/Basic/Attr.td
1790–1794 ↗(On Diff #100880)

This is a little painful here - I wonder if we have access to TargetInfo or maybe translate it in the target specific area of the front end? I worry about this sort of thing getting unwieldy.

Thoughts?

Otherwise OK.

fhahn updated this revision to Diff 100994.Jun 1 2017, 3:22 AM

Agreed, ARMTargetInfo is a much better place to do the conversion! Moved attribute conversion to ARMTargetInfo::initFeatureMap. Unfortunately FeaturesVec is const, so creating a mutable clone seemed the most straight-forward thing to do.

fhahn marked an inline comment as done.Jun 1 2017, 3:22 AM
echristo added inline comments.Jun 1 2017, 2:38 PM
lib/Basic/Targets.cpp
5439–5442

Won't work below in handleTargetFeatures?

fhahn added inline comments.Jun 2 2017, 3:19 AM
lib/Basic/Targets.cpp
5439–5442

Unfortunately I don't think so, as it seems like handleTargetFeatures is only called once in TargetInfo::CreateTargetInfo (https://github.com/llvm-mirror/clang/blob/master/lib/Basic/Targets.cpp#L9679
), while initFeatureMap is called for each function and thus can be used to modify the user provided target-features for individual functions (
https://github.com/llvm-mirror/clang/blob/master/lib/CodeGen/CodeGenModule.cpp#L4426)

ahatanak added inline comments.
lib/Basic/Targets.cpp
5444

This can be "else if".

fhahn updated this revision to Diff 101427.Jun 5 2017, 10:13 AM
fhahn marked an inline comment as done.

use else if

echristo accepted this revision.Jun 5 2017, 3:49 PM

Ah right. Thanks for looking.

LGTM.

-eric

This revision is now accepted and ready to land.Jun 5 2017, 3:49 PM
fhahn closed this revision.Jun 6 2017, 2:26 AM