Index: lib/CodeGen/TargetLoweringObjectFileImpl.cpp =================================================================== --- lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -809,17 +809,24 @@ //===----------------------------------------------------------------------===// static unsigned -getCOFFSectionFlags(SectionKind K) { +getCOFFSectionFlags(SectionKind K, const TargetMachine &TM) { unsigned Flags = 0; if (K.isMetadata()) Flags |= COFF::IMAGE_SCN_MEM_DISCARDABLE; - else if (K.isText()) + else if (K.isText()) { Flags |= COFF::IMAGE_SCN_MEM_EXECUTE | COFF::IMAGE_SCN_MEM_READ | COFF::IMAGE_SCN_CNT_CODE; + // This basically tells link.exe that this text section contains thumb + // code. See comments in MCObjectFileInfo::initCOFFMCObjectFileInfo (in + // MC/MCObjectFileInfo.cpp) for a more detailed explaination. + if (TM.getTargetTriple().getArch() == Triple::thumb) { + Flags |= COFF::IMAGE_SCN_MEM_16BIT; + } + } else if (K.isBSS()) Flags |= COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA | @@ -889,7 +896,7 @@ const GlobalValue *GV, SectionKind Kind, Mangler &Mang, const TargetMachine &TM) const { int Selection = 0; - unsigned Characteristics = getCOFFSectionFlags(Kind); + unsigned Characteristics = getCOFFSectionFlags(Kind, TM); StringRef Name = GV->getSection(); StringRef COMDATSymName = ""; if (GV->hasComdat()) { @@ -938,7 +945,7 @@ if ((EmitUniquedSection && !Kind.isCommon()) || GV->hasComdat()) { const char *Name = getCOFFSectionNameForUniqueGlobal(Kind); - unsigned Characteristics = getCOFFSectionFlags(Kind); + unsigned Characteristics = getCOFFSectionFlags(Kind, TM); Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT; int Selection = getSelectionForCOFF(GV); @@ -1015,7 +1022,7 @@ SectionKind Kind = SectionKind::getReadOnly(); const char *Name = getCOFFSectionNameForUniqueGlobal(Kind); - unsigned Characteristics = getCOFFSectionFlags(Kind); + unsigned Characteristics = getCOFFSectionFlags(Kind, TM); Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT; unsigned UniqueID = NextUniqueID++;