diff options
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/include/clang/Basic/DiagnosticFrontendKinds.td | 6 | ||||
| -rw-r--r-- | clang/include/clang/Basic/LangOptions.h | 2 | ||||
| -rw-r--r-- | clang/include/clang/Driver/CC1Options.td | 2 | ||||
| -rw-r--r-- | clang/include/clang/Driver/Options.td | 1 | ||||
| -rw-r--r-- | clang/lib/AST/RecordLayoutBuilder.cpp | 14 | ||||
| -rw-r--r-- | clang/lib/Driver/Tools.cpp | 4 | ||||
| -rw-r--r-- | clang/lib/Frontend/CompilerInvocation.cpp | 3 | ||||
| -rw-r--r-- | clang/lib/Serialization/ASTReader.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/Serialization/ASTWriter.cpp | 1 | ||||
| -rw-r--r-- | clang/test/CodeGen/mms-bitfields.c | 22 | 
10 files changed, 56 insertions, 1 deletions
diff --git a/clang/include/clang/Basic/DiagnosticFrontendKinds.td b/clang/include/clang/Basic/DiagnosticFrontendKinds.td index 263a6b1e3d9..819f5f08675 100644 --- a/clang/include/clang/Basic/DiagnosticFrontendKinds.td +++ b/clang/include/clang/Basic/DiagnosticFrontendKinds.td @@ -85,7 +85,8 @@ def err_verify_missing_end : Error<  def err_verify_invalid_content : Error<      "invalid expected %0: %1">;  def err_verify_inconsistent_diags : Error< -    "'%0' diagnostics %select{expected|seen}1 but not %select{seen|expected}1: %2">; +    "'%0' diagnostics %select{expected|seen}1 but not %select{seen|expected}1: " +    "%2">;  def note_fixit_applied : Note<"FIX-IT applied suggested code changes">;  def note_fixit_in_macro : Note< @@ -150,6 +151,9 @@ def warn_pch_gnu_keywords : Error<  def warn_pch_microsoft_extensions : Error<      "Microsoft extensions were %select{disabled|enabled}0 in PCH file but are "      "currently %select{disabled|enabled}1">; +def warn_pch_ms_bitfields : Error< +    "Microsoft-compatible structure layout was %select{disabled|enabled}0 in " +    "PCH file but is currently %select{disabled|enabled}1">;  def warn_pch_heinous_extensions : Error<      "heinous extensions were %select{disabled|enabled}0 in PCH file but are "      "currently %select{disabled|enabled}1">; diff --git a/clang/include/clang/Basic/LangOptions.h b/clang/include/clang/Basic/LangOptions.h index f31c4ff6fb9..74ae70b52e6 100644 --- a/clang/include/clang/Basic/LangOptions.h +++ b/clang/include/clang/Basic/LangOptions.h @@ -56,6 +56,7 @@ public:    unsigned SjLjExceptions    : 1;  // Use setjmp-longjump exception handling.    unsigned RTTI              : 1;  // Support RTTI information. +  unsigned MSBitfields       : 1; // MS-compatible structure layout    unsigned NeXTRuntime       : 1; // Use NeXT runtime.    unsigned Freestanding      : 1; // Freestanding implementation    unsigned NoBuiltin         : 1; // Do not use builtin functions (-fno-builtin) @@ -163,6 +164,7 @@ public:      C99 = Microsoft = Borland = CPlusPlus = CPlusPlus0x = 0;      CXXOperatorNames = PascalStrings = WritableStrings = ConstStrings = 0;      Exceptions = SjLjExceptions = Freestanding = NoBuiltin = 0; +    MSBitfields = 0;      NeXTRuntime = 1;      RTTI = 1;      LaxVectorConversions = 1; diff --git a/clang/include/clang/Driver/CC1Options.td b/clang/include/clang/Driver/CC1Options.td index 12800a8e809..fd9bec06617 100644 --- a/clang/include/clang/Driver/CC1Options.td +++ b/clang/include/clang/Driver/CC1Options.td @@ -183,6 +183,8 @@ def munwind_tables : Flag<"-munwind-tables">,    HelpText<"Generate unwinding tables for all functions">;  def mconstructor_aliases : Flag<"-mconstructor-aliases">,    HelpText<"Emit complete constructors and destructors as aliases when possible">; +def mms_bitfields : Flag<"-mms-bitfields">, +  HelpText<"Set the default structure layout to be compatible with the Microsoft compiler standard.">;  def O : Joined<"-O">, HelpText<"Optimization level">;  def Os : Flag<"-Os">, HelpText<"Optimize for size">; diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 02f41846d4a..735bb2d6f33 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -476,6 +476,7 @@ def mkernel : Flag<"-mkernel">, Group<m_Group>;  def mlinker_version_EQ : Joined<"-mlinker-version=">, Flags<[NoForward]>;  def mllvm : Separate<"-mllvm">;  def mmacosx_version_min_EQ : Joined<"-mmacosx-version-min=">, Group<m_Group>; +def mms_bitfields : Flag<"-mms-bitfields">, Group<m_Group>;  def mmmx : Flag<"-mmmx">, Group<m_x86_Features_Group>;  def mno_3dnowa : Flag<"-mno-3dnowa">, Group<m_x86_Features_Group>;  def mno_3dnow : Flag<"-mno-3dnow">, Group<m_x86_Features_Group>; diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp index 7e15dcce37c..730ec213580 100644 --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/lib/AST/RecordLayoutBuilder.cpp @@ -1402,6 +1402,20 @@ void RecordLayoutBuilder::LayoutField(const FieldDecl *D) {      std::pair<uint64_t, unsigned> FieldInfo = Context.getTypeInfo(D->getType());      FieldSize = FieldInfo.first;      FieldAlign = FieldInfo.second; + +    if (Context.getLangOptions().MSBitfields) { +      // If MS bitfield layout is required, figure out what type is being +      // laid out and align the field to the width of that type. +       +      // Resolve all typedefs down to their base type and round up the field +      // alignment if necessary. +      QualType T = Context.getBaseElementType(D->getType()); +      if (const BuiltinType *BTy = T->getAs<BuiltinType>()) { +        uint64_t TypeSize = Context.getTypeSize(BTy); +        if (TypeSize > FieldAlign) +          FieldAlign = TypeSize; +      } +    }    }    // The align if the field is not packed. This is to check if the attribute diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index d11db7ed2d1..8f8c64d4605 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -1028,6 +1028,10 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,    // work around a linker bug;  see <rdar://problem/7651567>.    if (getToolChain().getTriple().getOS() != llvm::Triple::Darwin)      CmdArgs.push_back("-mconstructor-aliases"); +     +  if (Args.hasArg(options::OPT_mms_bitfields)) { +    CmdArgs.push_back("-mms-bitfields"); +  }    // This is a coarse approximation of what llvm-gcc actually does, both    // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 3fdbc1683cd..9ad41458b8c 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -583,6 +583,8 @@ static void LangOptsToArgs(const LangOptions &Opts,      Res.push_back("-fsjlj-exceptions");    if (!Opts.RTTI)      Res.push_back("-fno-rtti"); +  if (Opts.MSBitfields) +    Res.push_back("-mms-bitfields");    if (!Opts.NeXTRuntime)      Res.push_back("-fgnu-runtime");    if (Opts.Freestanding) @@ -1445,6 +1447,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,                                                 Diags);    Opts.NumLargeByValueCopy = Args.getLastArgIntValue(OPT_Wlarge_by_value_copy,                                                      0, Diags); +  Opts.MSBitfields = Args.hasArg(OPT_mms_bitfields);    Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime);    Opts.ObjCConstantStringClass =      Args.getLastArgValue(OPT_fconstant_string_class); diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 7e7bd253aff..1e07e763145 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -96,6 +96,7 @@ PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts) {    PARSE_LANGOPT_IMPORTANT(AltiVec, diag::warn_pch_altivec);    PARSE_LANGOPT_IMPORTANT(Exceptions, diag::warn_pch_exceptions);    PARSE_LANGOPT_IMPORTANT(SjLjExceptions, diag::warn_pch_sjlj_exceptions); +  PARSE_LANGOPT_IMPORTANT(MSBitfields, diag::warn_pch_ms_bitfields);    PARSE_LANGOPT_IMPORTANT(NeXTRuntime, diag::warn_pch_objc_runtime);    PARSE_LANGOPT_IMPORTANT(Freestanding, diag::warn_pch_freestanding);    PARSE_LANGOPT_IMPORTANT(NoBuiltin, diag::warn_pch_builtins); @@ -2613,6 +2614,7 @@ bool ASTReader::ParseLanguageOptions(      PARSE_LANGOPT(AltiVec);      PARSE_LANGOPT(Exceptions);      PARSE_LANGOPT(SjLjExceptions); +    PARSE_LANGOPT(MSBitfields);      PARSE_LANGOPT(NeXTRuntime);      PARSE_LANGOPT(Freestanding);      PARSE_LANGOPT(NoBuiltin); diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index e90640711f9..b85aac1cc9f 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -911,6 +911,7 @@ void ASTWriter::WriteLanguageOptions(const LangOptions &LangOpts) {    Record.push_back(LangOpts.Exceptions);  // Support exception handling.    Record.push_back(LangOpts.SjLjExceptions); +  Record.push_back(LangOpts.MSBitfields); // MS-compatible structure layout    Record.push_back(LangOpts.NeXTRuntime); // Use NeXT runtime.    Record.push_back(LangOpts.Freestanding); // Freestanding implementation    Record.push_back(LangOpts.NoBuiltin); // Do not use builtin functions (-fno-builtin) diff --git a/clang/test/CodeGen/mms-bitfields.c b/clang/test/CodeGen/mms-bitfields.c new file mode 100644 index 00000000000..1617e8ac40d --- /dev/null +++ b/clang/test/CodeGen/mms-bitfields.c @@ -0,0 +1,22 @@ +// RUN: %clang_cc1 -triple i386-apple-darwin10 -mms-bitfields -emit-llvm %s -o - | FileCheck %s + +struct s1 { +  int       f32; +  long long f64; +} s1; + +// CHECK: %struct.s1 = type { i32, [4 x i8], i64 } + +struct s2 { +  int       f32; +  long long f64[4]; +} s2; + +// CHECK: %struct.s2 = type { i32, [4 x i8], [4 x i64] } + +struct s3 { +  int       f32; +  struct s1 s; +} s3; + +// CHECK: %struct.s3 = type { i32, [4 x i8], %struct.s1 }  | 

