diff --git a/lib/Target/ARM/ARMAsmPrinter.cpp b/lib/Target/ARM/ARMAsmPrinter.cpp index 0300f5875ca..b17d4aa19f7 100644 --- a/lib/Target/ARM/ARMAsmPrinter.cpp +++ b/lib/Target/ARM/ARMAsmPrinter.cpp @@ -629,6 +629,8 @@ void ARMAsmPrinter::emitAttributes() { MCTargetStreamer &TS = *OutStreamer.getTargetStreamer(); ARMTargetStreamer &ATS = static_cast(TS); + ATS.emitTextAttribute(ARMBuildAttrs::conformance, "2.09"); + ATS.switchVendor("aeabi"); std::string CPUString = Subtarget->getCPUString(); diff --git a/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp b/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp index e92a43c5b79..f9403063dd6 100644 --- a/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp +++ b/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp @@ -300,7 +300,19 @@ private: StringRef StringValue; static bool LessTag(const AttributeItem &LHS, const AttributeItem &RHS) { - return (LHS.Tag < RHS.Tag); + // The conformance tag must be emitted first when serialised + // into an object file. Specifically, the addenda to the ARM ABI + // states that (2.3.7.4): + // + // "To simplify recognition by consumers in the common case of + // claiming conformity for the whole file, this tag should be + // emitted first in a file-scope sub-subsection of the first + // public subsection of the attributes section." + // + // So it is special-cased in this comparison predicate when the + // attributes are sorted in finishAttributeSection(). + return (RHS.Tag != ARMBuildAttrs::conformance) && + ((LHS.Tag == ARMBuildAttrs::conformance) || (LHS.Tag < RHS.Tag)); } }; diff --git a/test/CodeGen/ARM/build-attributes.ll b/test/CodeGen/ARM/build-attributes.ll index d017e066562..3d1b2b7c8e0 100644 --- a/test/CodeGen/ARM/build-attributes.ll +++ b/test/CodeGen/ARM/build-attributes.ll @@ -279,6 +279,7 @@ ; V7-FAST: .eabi_attribute 23, 1 ; V8: .syntax unified +; V8: .eabi_attribute 67, "2.09" ; V8: .eabi_attribute 6, 14 ; V8-NOT: .eabi_attribute 19 ; V8: .eabi_attribute 20, 1 diff --git a/test/MC/ARM/directive-eabi_attribute.s b/test/MC/ARM/directive-eabi_attribute.s index 135afa74f2f..ac7358f39d7 100644 --- a/test/MC/ARM/directive-eabi_attribute.s +++ b/test/MC/ARM/directive-eabi_attribute.s @@ -5,6 +5,14 @@ .syntax unified .thumb + .eabi_attribute Tag_conformance, "2.09" +@ CHECK: .eabi_attribute 67, "2.09" +@ Tag_conformance should be be emitted first in a file-scope +@ sub-subsection of the first public subsection of the attributes +@ section. 2.3.7.4 of ABI Addenda. +@ CHECK-OBJ: Tag: 67 +@ CHECK-OBJ-NEXT: TagName: conformance +@ CHECK-OBJ-NEXT: Value: 2.09 .eabi_attribute Tag_CPU_raw_name, "Cortex-A9" @ CHECK: .eabi_attribute 4, "Cortex-A9" @ CHECK-OBJ: Tag: 4 @@ -220,11 +228,6 @@ @ CHECK-OBJ-NEXT: Value: 0 @ CHECK-OBJ-NEXT: TagName: T2EE_use @ CHECK-OBJ-NEXT: Description: Not Permitted - .eabi_attribute Tag_conformance, "2.09" -@ CHECK: .eabi_attribute 67, "2.09" -@ CHECK-OBJ: Tag: 67 -@ CHECK-OBJ-NEXT: TagName: conformance -@ CHECK-OBJ-NEXT: Value: 2.09 .eabi_attribute Tag_Virtualization_use, 0 @ CHECK: .eabi_attribute 68, 0 @ CHECK-OBJ: Tag: 68 diff --git a/test/tools/llvm-readobj/ARM/attribute-conformance-1.s b/test/tools/llvm-readobj/ARM/attribute-conformance-1.s new file mode 100644 index 00000000000..daa44c14eca --- /dev/null +++ b/test/tools/llvm-readobj/ARM/attribute-conformance-1.s @@ -0,0 +1,8 @@ +@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s +@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \ +@ RUN: | llvm-readobj -arm-attributes - | FileCheck %s --check-prefix=CHECK-OBJ +.eabi_attribute Tag_conformance, "0" +@CHECK: .eabi_attribute 67, "0" +@CHECK-OBJ: Tag: 67 +@CHECK-OBJ-NEXT: TagName: conformance +@CHECK-OBJ-NEXT: Value: 0 diff --git a/test/tools/llvm-readobj/ARM/attribute-conformance-2.s b/test/tools/llvm-readobj/ARM/attribute-conformance-2.s new file mode 100644 index 00000000000..47c83c03696 --- /dev/null +++ b/test/tools/llvm-readobj/ARM/attribute-conformance-2.s @@ -0,0 +1,8 @@ +@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s +@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \ +@ RUN: | llvm-readobj -arm-attributes - | FileCheck %s --check-prefix=CHECK-OBJ +.eabi_attribute Tag_conformance, "A.long--non numeric oddity...!!" +@CHECK: .eabi_attribute 67, "A.long--non numeric oddity...!!" +@CHECK-OBJ: Tag: 67 +@CHECK-OBJ-NEXT: TagName: conformance +@CHECK-OBJ-NEXT: Value: A.long--non numeric oddity...!!