Split PrintSectionFlags

llvm-svn: 53302
This commit is contained in:
Anton Korobeynikov 2008-07-09 13:21:49 +00:00
parent cf638bfaac
commit 4e4f3168dd
2 changed files with 70 additions and 81 deletions

View File

@ -313,6 +313,35 @@ X86ELFTargetAsmInfo::PreferredEHDataFormat(DwarfEncoding::Target Reason,
}
}
std::string X86ELFTargetAsmInfo::PrintSectionFlags(unsigned flags) const {
std::string Flags = ",\"";
if (!(flags & SectionFlags::Debug))
Flags += 'a';
if (flags & SectionFlags::Code)
Flags += 'x';
if (flags & SectionFlags::Writeable)
Flags += 'w';
if (flags & SectionFlags::Mergeable)
Flags += 'M';
if (flags & SectionFlags::Strings)
Flags += 'S';
if (flags & SectionFlags::TLS)
Flags += 'T';
Flags += "\"";
// FIXME: There can be exceptions here
if (flags & SectionFlags::BSS)
Flags += ",@nobits";
else
Flags += ",@progbits";
// FIXME: entity size for mergeable sections
return Flags;
}
X86COFFTargetAsmInfo::X86COFFTargetAsmInfo(const X86TargetMachine &TM):
X86TargetAsmInfo(TM) {
GlobalPrefix = "_";
@ -345,32 +374,6 @@ X86COFFTargetAsmInfo::X86COFFTargetAsmInfo(const X86TargetMachine &TM):
DwarfMacInfoSection = "\t.section\t.debug_macinfo,\"dr\"";
}
X86WinTargetAsmInfo::X86WinTargetAsmInfo(const X86TargetMachine &TM):
X86TargetAsmInfo(TM) {
GlobalPrefix = "_";
CommentString = ";";
PrivateGlobalPrefix = "$";
AlignDirective = "\talign\t";
ZeroDirective = "\tdb\t";
ZeroDirectiveSuffix = " dup(0)";
AsciiDirective = "\tdb\t";
AscizDirective = 0;
Data8bitsDirective = "\tdb\t";
Data16bitsDirective = "\tdw\t";
Data32bitsDirective = "\tdd\t";
Data64bitsDirective = "\tdq\t";
HasDotTypeDotSizeDirective = false;
TextSection = "_text";
DataSection = "_data";
JumpTableDataSection = NULL;
SwitchToSectionDirective = "";
TextSectionStartSuffix = "\tsegment 'CODE'";
DataSectionStartSuffix = "\tsegment 'DATA'";
SectionEndDirectiveSuffix = "\tends\n";
}
unsigned
X86COFFTargetAsmInfo::PreferredEHDataFormat(DwarfEncoding::Target Reason,
bool Global) const {
@ -430,6 +433,45 @@ X86COFFTargetAsmInfo::UniqueSectionForGlobal(const GlobalValue* GV,
}
}
std::string X86COFFTargetAsmInfo::PrintSectionFlags(unsigned flags) const {
std::string Flags = ",\"";
if (flags & SectionFlags::Code)
Flags += 'x';
if (flags & SectionFlags::Writeable)
Flags += 'w';
Flags += "\"";
return Flags;
}
X86WinTargetAsmInfo::X86WinTargetAsmInfo(const X86TargetMachine &TM):
X86TargetAsmInfo(TM) {
GlobalPrefix = "_";
CommentString = ";";
PrivateGlobalPrefix = "$";
AlignDirective = "\talign\t";
ZeroDirective = "\tdb\t";
ZeroDirectiveSuffix = " dup(0)";
AsciiDirective = "\tdb\t";
AscizDirective = 0;
Data8bitsDirective = "\tdb\t";
Data16bitsDirective = "\tdw\t";
Data32bitsDirective = "\tdd\t";
Data64bitsDirective = "\tdq\t";
HasDotTypeDotSizeDirective = false;
TextSection = "_text";
DataSection = "_data";
JumpTableDataSection = NULL;
SwitchToSectionDirective = "";
TextSectionStartSuffix = "\tsegment 'CODE'";
DataSectionStartSuffix = "\tsegment 'DATA'";
SectionEndDirectiveSuffix = "\tends\n";
}
std::string X86TargetAsmInfo::SectionForGlobal(const GlobalValue *GV) const {
SectionKind::Kind kind = SectionKindForGlobal(GV);
unsigned flags = SectionFlagsForGlobal(GV, GV->getSection().c_str());
@ -493,57 +535,3 @@ std::string X86TargetAsmInfo::SectionForGlobal(const GlobalValue *GV) const {
Name += PrintSectionFlags(flags);
return Name;
}
std::string X86TargetAsmInfo::PrintSectionFlags(unsigned flags) const {
const X86Subtarget *Subtarget = &X86TM->getSubtarget<X86Subtarget>();
std::string Flags = "";
// Add all special flags, etc
switch (Subtarget->TargetType) {
case X86Subtarget::isELF:
Flags += ",\"";
if (!(flags & SectionFlags::Debug))
Flags += 'a';
if (flags & SectionFlags::Code)
Flags += 'x';
if (flags & SectionFlags::Writeable)
Flags += 'w';
if (flags & SectionFlags::Mergeable)
Flags += 'M';
if (flags & SectionFlags::Strings)
Flags += 'S';
if (flags & SectionFlags::TLS)
Flags += 'T';
Flags += "\"";
// FIXME: There can be exceptions here
if (flags & SectionFlags::BSS)
Flags += ",@nobits";
else
Flags += ",@progbits";
// FIXME: entity size for mergeable sections
break;
case X86Subtarget::isCygwin:
case X86Subtarget::isMingw:
Flags += ",\"";
if (flags & SectionFlags::Code)
Flags += 'x';
if (flags & SectionFlags::Writeable)
Flags += 'w';
Flags += "\"";
break;
case X86Subtarget::isDarwin:
// Darwin does not use any special flags
default:
break;
}
return Flags;
}

View File

@ -26,7 +26,6 @@ namespace llvm {
virtual bool ExpandInlineAsm(CallInst *CI) const;
virtual std::string SectionForGlobal(const GlobalValue *GV) const;
virtual std::string PrintSectionFlags(unsigned flags) const;
private:
bool LowerToBSwap(CallInst *CI) const;
@ -46,6 +45,7 @@ namespace llvm {
explicit X86ELFTargetAsmInfo(const X86TargetMachine &TM);
virtual unsigned PreferredEHDataFormat(DwarfEncoding::Target Reason,
bool Global) const;
virtual std::string PrintSectionFlags(unsigned flags) const;
};
struct X86COFFTargetAsmInfo : public X86TargetAsmInfo {
@ -54,6 +54,7 @@ namespace llvm {
bool Global) const;
virtual std::string UniqueSectionForGlobal(const GlobalValue* GV,
SectionKind::Kind kind) const;
virtual std::string PrintSectionFlags(unsigned flags) const;
};
struct X86WinTargetAsmInfo : public X86TargetAsmInfo {