resolve a fixme: the "nonexecutable stack directive" is actually

a .section.  Switch to it with SwitchSection.

However, I think that this directive should be safe on any ELF target.
If so, we should hoist it up out of the X86 and SystemZ targets.

llvm-svn: 94298
This commit is contained in:
Chris Lattner 2010-01-23 07:21:06 +00:00
parent e244ff35d8
commit 76bdea3290
9 changed files with 35 additions and 26 deletions

View File

@ -20,6 +20,9 @@
#include <cassert>
namespace llvm {
class MCSection;
class MCContext;
/// MCAsmInfo - This class is intended to be used as a base class for asm
/// properties and features specific to the target.
namespace ExceptionHandling { enum ExceptionsType { None, Dwarf, SjLj }; }
@ -30,10 +33,9 @@ namespace llvm {
// Properties to be set by the target writer, used to configure asm printer.
//
/// NonexecutableStackDirective - Directive for declaring to the
/// linker and beyond that the emitted code does not require stack
/// memory to be executable.
const char *NonexecutableStackDirective; // Default is null.
/// HasSubsectionsViaSymbols - True if this target has the MachO
/// .subsections_via_symbols directive.
bool HasSubsectionsViaSymbols; // Default is false.
/// HasMachoZeroFillDirective - True if this is a MachO target that supports
/// the macho-specific .zerofill directive for emitting BSS Symbols.
@ -288,14 +290,12 @@ namespace llvm {
explicit MCAsmInfo();
virtual ~MCAsmInfo();
/// getSLEB128Size - Compute the number of bytes required for a signed
/// leb128 value.
// FIXME: move these methods to DwarfPrinter when the JIT stops using them.
static unsigned getSLEB128Size(int Value);
/// getULEB128Size - Compute the number of bytes required for an unsigned
/// leb128 value.
static unsigned getULEB128Size(unsigned Value);
bool hasSubsectionsViaSymbols() const { return HasSubsectionsViaSymbols; }
// Data directive accessors.
//
const char *getData8bitsDirective(unsigned AS = 0) const {
@ -311,6 +311,12 @@ namespace llvm {
return AS == 0 ? Data64bitsDirective : getDataASDirective(64, AS);
}
/// getNonexecutableStackSection - Targets can implement this method to
/// specify a section to switch to if the translation unit doesn't have any
/// trampolines that require an executable stack.
virtual MCSection *getNonexecutableStackSection(MCContext &Ctx) const {
return 0;
}
bool usesSunStyleELFSectionSwitchSyntax() const {
return SunStyleELFSectionSwitchSyntax;
@ -326,9 +332,6 @@ namespace llvm {
bool hasStaticCtorDtorReferenceInStaticMode() const {
return HasStaticCtorDtorReferenceInStaticMode;
}
const char *getNonexecutableStackDirective() const {
return NonexecutableStackDirective;
}
bool needsSet() const {
return NeedsSet;
}

View File

@ -31,7 +31,7 @@ class MCSectionELF : public MCSection {
unsigned Flags;
/// IsExplicit - Indicates that this section comes from globals with an
/// explicit section specfied.
/// explicit section specified.
bool IsExplicit;
protected:

View File

@ -345,11 +345,8 @@ bool AsmPrinter::doFinalization(Module &M) {
// to be executable. Some targets have a directive to declare this.
Function *InitTrampolineIntrinsic = M.getFunction("llvm.init.trampoline");
if (!InitTrampolineIntrinsic || InitTrampolineIntrinsic->use_empty())
// FIXME: This is actually a section switch on linux/x86 and systemz, use
// switch section.
if (MAI->getNonexecutableStackDirective())
O << MAI->getNonexecutableStackDirective() << '\n';
if (MCSection *S = MAI->getNonexecutableStackSection(OutContext))
OutStreamer.SwitchSection(S);
// Allow the target to emit any magic that it wants at the end of the file,
// after everything else has gone out.

View File

@ -19,9 +19,9 @@
using namespace llvm;
MCAsmInfo::MCAsmInfo() {
HasSubsectionsViaSymbols = false;
HasMachoZeroFillDirective = false;
HasStaticCtorDtorReferenceInStaticMode = false;
NonexecutableStackDirective = 0;
NeedsSet = false;
MaxInstLength = 4;
PCSymbol = "$";

View File

@ -24,6 +24,7 @@ MCAsmInfoDarwin::MCAsmInfoDarwin() {
NeedsSet = true;
AllowQuotesInName = true;
HasSingleParameterDotFile = false;
HasSubsectionsViaSymbols = true;
AlignmentIsInBytes = false;
InlineAsmStart = " InlineAsm Start";

View File

@ -12,6 +12,7 @@
//===----------------------------------------------------------------------===//
#include "SystemZMCAsmInfo.h"
#include "llvm/MC/MCSectionELF.h"
using namespace llvm;
SystemZMCAsmInfo::SystemZMCAsmInfo(const Target &T, const StringRef &TT) {
@ -21,6 +22,9 @@ SystemZMCAsmInfo::SystemZMCAsmInfo(const Target &T, const StringRef &TT) {
WeakRefDirective = "\t.weak\t";
SetDirective = "\t.set\t";
PCSymbol = ".";
NonexecutableStackDirective = "\t.section\t.note.GNU-stack,\"\",@progbits";
}
MCSection *SystemZMCAsmInfo::getNonexecutableStackSection(MCContext &Ctx) const{
return MCSectionELF::Create(".note.GNU-stack", MCSectionELF::SHT_PROGBITS,
0, SectionKind::getMetadata(), false, Ctx);
}

View File

@ -22,6 +22,7 @@ namespace llvm {
struct SystemZMCAsmInfo : public MCAsmInfo {
explicit SystemZMCAsmInfo(const Target &T, const StringRef &TT);
virtual MCSection *getNonexecutableStackSection(MCContext &Ctx) const;
};
} // namespace llvm

View File

@ -14,6 +14,7 @@
#include "X86MCAsmInfo.h"
#include "X86TargetMachine.h"
#include "llvm/ADT/Triple.h"
#include "llvm/MC/MCSectionELF.h"
#include "llvm/Support/CommandLine.h"
using namespace llvm;
@ -87,10 +88,11 @@ X86ELFMCAsmInfo::X86ELFMCAsmInfo(const Triple &Triple) {
// Exceptions handling
ExceptionsType = ExceptionHandling::Dwarf;
AbsoluteEHSectionOffsets = false;
}
// On Linux we must declare when we can use a non-executable stack.
if (Triple.getOS() == Triple::Linux)
NonexecutableStackDirective = "\t.section\t.note.GNU-stack,\"\",@progbits";
MCSection *X86ELFMCAsmInfo::getNonexecutableStackSection(MCContext &Ctx) const {
return MCSectionELF::Create(".note.GNU-stack", MCSectionELF::SHT_PROGBITS,
0, SectionKind::getMetadata(), false, Ctx);
}
X86MCAsmInfoCOFF::X86MCAsmInfoCOFF(const Triple &Triple) {

View File

@ -27,6 +27,7 @@ namespace llvm {
struct X86ELFMCAsmInfo : public MCAsmInfo {
explicit X86ELFMCAsmInfo(const Triple &Triple);
virtual MCSection *getNonexecutableStackSection(MCContext &Ctx) const;
};
struct X86MCAsmInfoCOFF : public MCAsmInfoCOFF {