mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-21 03:05:26 -04:00
[ARM] Fix Thumb text sections' flags under COFF/Windows
The main issue here is that the "thumb" flag wasn't set for some of these sections, making MSVC's link.exe fails to correctly relocate code against the symbols inside these sections. link.exe could fail for instance with the "fixup is not aligned for target 'XX'" error. If linking doesn't fail, the relocation process goes wrong in the end and invalid code is generated by the linker. This patch adds Thumb/ARM information so that the right flags are set on COFF/Windows. Patch by Adrien Guinet. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273880 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -809,8 +809,9 @@ void TargetLoweringObjectFileMachO::getNameWithPrefix(
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
static unsigned
|
||||
getCOFFSectionFlags(SectionKind K) {
|
||||
getCOFFSectionFlags(SectionKind K, const TargetMachine &TM) {
|
||||
unsigned Flags = 0;
|
||||
bool isThumb = TM.getTargetTriple().getArch() == Triple::thumb;
|
||||
|
||||
if (K.isMetadata())
|
||||
Flags |=
|
||||
@@ -819,7 +820,8 @@ getCOFFSectionFlags(SectionKind K) {
|
||||
Flags |=
|
||||
COFF::IMAGE_SCN_MEM_EXECUTE |
|
||||
COFF::IMAGE_SCN_MEM_READ |
|
||||
COFF::IMAGE_SCN_CNT_CODE;
|
||||
COFF::IMAGE_SCN_CNT_CODE |
|
||||
(isThumb ? COFF::IMAGE_SCN_MEM_16BIT : (COFF::SectionCharacteristics)0);
|
||||
else if (K.isBSS())
|
||||
Flags |=
|
||||
COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA |
|
||||
@@ -889,7 +891,7 @@ MCSection *TargetLoweringObjectFileCOFF::getExplicitSectionGlobal(
|
||||
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 +940,7 @@ MCSection *TargetLoweringObjectFileCOFF::SelectSectionForGlobal(
|
||||
|
||||
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 +1017,7 @@ MCSection *TargetLoweringObjectFileCOFF::getSectionForJumpTable(
|
||||
|
||||
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++;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user