Index: lib/Target/ARM/ARMAsmPrinter.cpp =================================================================== --- lib/Target/ARM/ARMAsmPrinter.cpp +++ lib/Target/ARM/ARMAsmPrinter.cpp @@ -904,16 +904,16 @@ ATS.emitAttribute(ARMBuildAttrs::ABI_PCS_wchar_t, WCharWidth); } - // ABI_enum_size to indicate enum width - // FIXME: There is no way to emit value 0 (enums prohibited) or value 3 - // (all enums contain a value needing 32 bits to encode). - if (auto EnumWidthValue = mdconst::extract_or_null( - SourceModule->getModuleFlag("min_enum_size"))) { - int EnumWidth = EnumWidthValue->getZExtValue(); - assert((EnumWidth == 1 || EnumWidth == 4) && - "Minimum enum width must be 1 or 4 bytes"); - int EnumBuildAttr = EnumWidth == 1 ? 1 : 2; - ATS.emitAttribute(ARMBuildAttrs::ABI_enum_size, EnumBuildAttr); + // Generate the correct Tag_ABI_enum_size build attribute. + if (auto BuildAttrValue = mdconst::extract_or_null( + SourceModule->getModuleFlag("enumsize_buildattr"))) { + int EnumSizeBuildAttr = BuildAttrValue->getZExtValue(); + assert((EnumSizeBuildAttr == ARMBuildAttrs::EnumProhibited || + EnumSizeBuildAttr == ARMBuildAttrs::EnumSmallest || + EnumSizeBuildAttr == ARMBuildAttrs::Enum32Bit || + EnumSizeBuildAttr == ARMBuildAttrs::Enum32BitABI) && + "Unsupported build attribute"); + ATS.emitAttribute(ARMBuildAttrs::ABI_enum_size, EnumSizeBuildAttr); } } } Index: test/CodeGen/ARM/2016-08-24-ARM-LDST-dbginfo-bug.ll =================================================================== --- test/CodeGen/ARM/2016-08-24-ARM-LDST-dbginfo-bug.ll +++ test/CodeGen/ARM/2016-08-24-ARM-LDST-dbginfo-bug.ll @@ -37,7 +37,7 @@ !3 = !{i32 2, !"Dwarf Version", i32 4} !4 = !{i32 2, !"Debug Info Version", i32 3} !5 = !{i32 1, !"wchar_size", i32 4} -!6 = !{i32 1, !"min_enum_size", i32 4} +!6 = !{i32 1, !"enumsize_buildattr", i32 2} !7 = !{!"clang version 4.0.0 "} !8 = distinct !DISubprogram(name: "s_idx", scope: !1, file: !1, line: 6, type: !9, isLocal: false, isDefinition: true, scopeLine: 7, flags: DIFlagPrototyped, isOptimized: true, unit: !0, variables: !16) !9 = !DISubroutineType(types: !10) Index: test/CodeGen/ARM/arm-shrink-wrapping-linux.ll =================================================================== --- test/CodeGen/ARM/arm-shrink-wrapping-linux.ll +++ test/CodeGen/ARM/arm-shrink-wrapping-linux.ll @@ -136,7 +136,7 @@ !llvm.module.flags = !{!0, !1} !0 = !{i32 1, !"wchar_size", i32 4} -!1 = !{i32 1, !"min_enum_size", i32 4} +!1 = !{i32 1, !"enumsize_buildattr", i32 2} !2 = !{!3, !3, i64 0} !3 = !{!"omnipotent char", !4, i64 0} !4 = !{!"Simple C/C++ TBAA"} Index: test/CodeGen/ARM/constantpool-promote-dbg.ll =================================================================== --- test/CodeGen/ARM/constantpool-promote-dbg.ll +++ test/CodeGen/ARM/constantpool-promote-dbg.ll @@ -31,7 +31,7 @@ !3 = !{i32 2, !"Dwarf Version", i32 4} !4 = !{i32 2, !"Debug Info Version", i32 3} !5 = !{i32 1, !"wchar_size", i32 4} -!6 = !{i32 1, !"min_enum_size", i32 4} +!6 = !{i32 1, !"enumsize_buildattr", i32 2} !7 = !{!"clang version 3.9.0 (http://llvm.org/git/clang.git 075a2bc2570dfcbb6d6aed6c836e4c62b37afea6)"} !8 = distinct !DISubprogram(name: "fn1", scope: !1, file: !1, line: 1, type: !9, isLocal: false, isDefinition: true, scopeLine: 1, isOptimized: true, unit: !0, variables: !2) !9 = !DISubroutineType(types: !10) Index: test/CodeGen/ARM/constantpool-promote.ll =================================================================== --- test/CodeGen/ARM/constantpool-promote.ll +++ test/CodeGen/ARM/constantpool-promote.ll @@ -147,5 +147,5 @@ !llvm.ident = !{!2} !0 = !{i32 1, !"wchar_size", i32 4} -!1 = !{i32 1, !"min_enum_size", i32 4} +!1 = !{i32 1, !"enumsize_buildattr", i32 2} !2 = !{!"Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)"} Index: test/CodeGen/ARM/metadata-abi-enums.ll =================================================================== --- /dev/null +++ test/CodeGen/ARM/metadata-abi-enums.ll @@ -0,0 +1,14 @@ +; RUN: llc < %s | FileCheck %s + +target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64" +target triple = "armv7--none-eabi" + +define i32 @f(i64 %z) { + ret i32 0 +} + +!llvm.module.flags = !{!0} + +!0 = !{i32 1, !"enumsize_buildattr", i32 3} + +; CHECK: .eabi_attribute 26, 3 @ Tag_ABI_enum_size Index: test/CodeGen/ARM/metadata-default.ll =================================================================== --- test/CodeGen/ARM/metadata-default.ll +++ test/CodeGen/ARM/metadata-default.ll @@ -10,7 +10,7 @@ !llvm.module.flags = !{!0, !1} !0 = !{i32 1, !"wchar_size", i32 4} -!1 = !{i32 1, !"min_enum_size", i32 4} +!1 = !{i32 1, !"enumsize_buildattr", i32 2} ; CHECK: .eabi_attribute 18, 4 @ Tag_ABI_PCS_wchar_t ; CHECK: .eabi_attribute 26, 2 @ Tag_ABI_enum_size Index: test/CodeGen/ARM/metadata-no-enums.ll =================================================================== --- /dev/null +++ test/CodeGen/ARM/metadata-no-enums.ll @@ -0,0 +1,14 @@ +; RUN: llc < %s | FileCheck %s + +target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64" +target triple = "armv7--none-eabi" + +define i32 @f(i64 %z) { + ret i32 0 +} + +!llvm.module.flags = !{!0} + +!0 = !{i32 1, !"enumsize_buildattr", i32 0} + +; CHECK: .eabi_attribute 26, 0 @ Tag_ABI_enum_size Index: test/CodeGen/ARM/metadata-short-enums.ll =================================================================== --- test/CodeGen/ARM/metadata-short-enums.ll +++ test/CodeGen/ARM/metadata-short-enums.ll @@ -10,7 +10,7 @@ !llvm.module.flags = !{!0, !1} !0 = !{i32 1, !"wchar_size", i32 4} -!1 = !{i32 1, !"min_enum_size", i32 1} +!1 = !{i32 1, !"enumsize_buildattr", i32 1} ; CHECK: .eabi_attribute 18, 4 @ Tag_ABI_PCS_wchar_t ; CHECK: .eabi_attribute 26, 1 @ Tag_ABI_enum_size Index: test/CodeGen/ARM/metadata-short-wchar.ll =================================================================== --- test/CodeGen/ARM/metadata-short-wchar.ll +++ test/CodeGen/ARM/metadata-short-wchar.ll @@ -10,7 +10,7 @@ !llvm.module.flags = !{!0, !1} !0 = !{i32 1, !"wchar_size", i32 2} -!1 = !{i32 1, !"min_enum_size", i32 4} +!1 = !{i32 1, !"enumsize_buildattr", i32 2} ; CHECK: .eabi_attribute 18, 2 @ Tag_ABI_PCS_wchar_t ; CHECK: .eabi_attribute 26, 2 @ Tag_ABI_enum_size Index: test/CodeGen/MIR/ARM/sched-it-debug-nodes.mir =================================================================== --- test/CodeGen/MIR/ARM/sched-it-debug-nodes.mir +++ test/CodeGen/MIR/ARM/sched-it-debug-nodes.mir @@ -74,7 +74,7 @@ !22 = !{i32 2, !"Dwarf Version", i32 4} !23 = !{i32 2, !"Debug Info Version", i32 3} !24 = !{i32 1, !"wchar_size", i32 4} - !25 = !{i32 1, !"min_enum_size", i32 4} + !25 = !{i32 1, !"enumsize_buildattr", i32 2} !26 = !{!"clang version 3.7.0 (llvm/trunk 237059)"} !27 = !DIExpression() !28 = !DILocation(line: 9, scope: !4) Index: test/DebugInfo/ARM/PR26163.ll =================================================================== --- test/DebugInfo/ARM/PR26163.ll +++ test/DebugInfo/ARM/PR26163.ll @@ -94,7 +94,7 @@ !21 = !DIDerivedType(tag: DW_TAG_member, name: "tv_usec", scope: !17, file: !5, line: 4, baseType: !8, size: 32, align: 32, offset: 64) !22 = !{i32 2, !"Debug Info Version", i32 3} !23 = !{i32 1, !"wchar_size", i32 4} -!24 = !{i32 1, !"min_enum_size", i32 4} +!24 = !{i32 1, !"enumsize_buildattr", i32 2} !25 = !{!"clang version 3.9.0 (https://github.com/llvm-mirror/clang 89dda3855cda574f355e6defa1d77bdae5053994) (llvm/trunk 257891)"} !26 = !DIExpression() !27 = !DILocation(line: 11, scope: !11, inlinedAt: !28) Index: test/DebugInfo/ARM/big-endian-dump.ll =================================================================== --- test/DebugInfo/ARM/big-endian-dump.ll +++ test/DebugInfo/ARM/big-endian-dump.ll @@ -14,5 +14,5 @@ !3 = !{i32 2, !"Dwarf Version", i32 4} !4 = !{i32 2, !"Debug Info Version", i32 1} !5 = !{i32 1, !"wchar_size", i32 4} -!6 = !{i32 1, !"min_enum_size", i32 4} +!6 = !{i32 1, !"enumsize_buildattr", i32 2} !7 = !{!"clang version 3.6.0 "} Index: test/DebugInfo/ARM/little-endian-dump.ll =================================================================== --- test/DebugInfo/ARM/little-endian-dump.ll +++ test/DebugInfo/ARM/little-endian-dump.ll @@ -14,5 +14,5 @@ !3 = !{i32 2, !"Dwarf Version", i32 4} !4 = !{i32 2, !"Debug Info Version", i32 1} !5 = !{i32 1, !"wchar_size", i32 4} -!6 = !{i32 1, !"min_enum_size", i32 4} +!6 = !{i32 1, !"enumsize_buildattr", i32 2} !7 = !{!"clang version 3.6.0 "} Index: test/DebugInfo/ARM/multiple-constant-uses-drops-dbgloc.ll =================================================================== --- test/DebugInfo/ARM/multiple-constant-uses-drops-dbgloc.ll +++ test/DebugInfo/ARM/multiple-constant-uses-drops-dbgloc.ll @@ -46,7 +46,7 @@ !12 = !{i32 2, !"Dwarf Version", i32 4} !13 = !{i32 2, !"Debug Info Version", i32 3} !14 = !{i32 1, !"wchar_size", i32 4} -!15 = !{i32 1, !"min_enum_size", i32 4} +!15 = !{i32 1, !"enumsize_buildattr", i32 2} !16 = !{!"clang version 3.7.0 (http://llvm.org/git/clang.git 9b0abb9df531ef7928c8182120e1869affca17d5) (http://llvm.org/git/llvm.git b1e759524dd94f7ce1e24935daed8383927e96c1)"} !17 = !DILocation(line: 6, column: 8, scope: !4) !18 = !DILocation(line: 7, column: 7, scope: !4)