mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-24 12:19:53 +00:00
the latest assembler that runs on powerpc 10.4 machines doesn't
support aligned comm. Detect when compiling for 10.4 and don't emit an alignment for comm. THis will hopefully fix PR8198. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@114817 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
80945784f9
commit
8048ebe91d
@ -92,6 +92,11 @@ protected:
|
||||
// information for a TLS variable, it'll go here.
|
||||
const MCSection *TLSExtraDataSection;
|
||||
|
||||
/// CommDirectiveSupportsAlignment - True if .comm supports alignment. This
|
||||
/// is a hack for as long as we support 10.4 Tiger, whose assembler doesn't
|
||||
/// support alignment on comm.
|
||||
bool CommDirectiveSupportsAlignment;
|
||||
|
||||
/// SupportsWeakEmptyEHFrame - True if target object file supports a
|
||||
/// weak_definition of constant 0 for an omitted EH frame.
|
||||
bool SupportsWeakOmittedEHFrame;
|
||||
@ -128,6 +133,10 @@ public:
|
||||
return SupportsWeakOmittedEHFrame;
|
||||
}
|
||||
|
||||
bool getCommDirectiveSupportsAlignment() const {
|
||||
return CommDirectiveSupportsAlignment;
|
||||
}
|
||||
|
||||
const MCSection *getTextSection() const { return TextSection; }
|
||||
const MCSection *getDataSection() const { return DataSection; }
|
||||
const MCSection *getBSSSection() const { return BSSSection; }
|
||||
|
@ -280,6 +280,8 @@ private:
|
||||
|
||||
public:
|
||||
|
||||
const std::string &getTargetTriple() const { return TargetTriple; }
|
||||
|
||||
/// addPassesToEmitFile - Add passes to the specified pass manager to get the
|
||||
/// specified file emitted. Typically this will involve several steps of code
|
||||
/// generation. If OptLevel is None, the code generator should emit code as
|
||||
|
@ -282,8 +282,12 @@ void AsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
|
||||
|
||||
// Handle common symbols.
|
||||
if (GVKind.isCommon()) {
|
||||
unsigned Align = 1 << AlignLog;
|
||||
if (!getObjFileLowering().getCommDirectiveSupportsAlignment())
|
||||
Align = 0;
|
||||
|
||||
// .comm _foo, 42, 4
|
||||
OutStreamer.EmitCommonSymbol(GVSym, Size, 1 << AlignLog);
|
||||
OutStreamer.EmitCommonSymbol(GVSym, Size, Align);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -301,11 +305,15 @@ void AsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
|
||||
OutStreamer.EmitLocalCommonSymbol(GVSym, Size);
|
||||
return;
|
||||
}
|
||||
|
||||
unsigned Align = 1 << AlignLog;
|
||||
if (!getObjFileLowering().getCommDirectiveSupportsAlignment())
|
||||
Align = 0;
|
||||
|
||||
// .local _foo
|
||||
OutStreamer.EmitSymbolAttribute(GVSym, MCSA_Local);
|
||||
// .comm _foo, 42, 4
|
||||
OutStreamer.EmitCommonSymbol(GVSym, Size, 1 << AlignLog);
|
||||
OutStreamer.EmitCommonSymbol(GVSym, Size, Align);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -33,6 +33,7 @@
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/ADT/SmallString.h"
|
||||
#include "llvm/ADT/StringExtras.h"
|
||||
#include "llvm/ADT/Triple.h"
|
||||
using namespace llvm;
|
||||
using namespace dwarf;
|
||||
|
||||
@ -450,6 +451,19 @@ void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,
|
||||
IsFunctionEHSymbolGlobal = true;
|
||||
IsFunctionEHFrameSymbolPrivate = false;
|
||||
SupportsWeakOmittedEHFrame = false;
|
||||
|
||||
Triple T(((LLVMTargetMachine&)TM).getTargetTriple());
|
||||
if (T.getOS() == Triple::Darwin) {
|
||||
switch (T.getDarwinMajorNumber()) {
|
||||
case 7: // 10.3 Panther.
|
||||
case 8: // 10.4 Tiger.
|
||||
CommDirectiveSupportsAlignment = false;
|
||||
break;
|
||||
case 9: // 10.5 Leopard.
|
||||
case 10: // 10.6 SnowLeopard.
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
TargetLoweringObjectFile::Initialize(Ctx, TM);
|
||||
|
||||
|
@ -45,6 +45,7 @@ TargetLoweringObjectFile::TargetLoweringObjectFile() : Ctx(0) {
|
||||
LSDASection = 0;
|
||||
EHFrameSection = 0;
|
||||
|
||||
CommDirectiveSupportsAlignment = true;
|
||||
DwarfAbbrevSection = 0;
|
||||
DwarfInfoSection = 0;
|
||||
DwarfLineSection = 0;
|
||||
|
@ -1,5 +1,6 @@
|
||||
; RUN: llc < %s -mtriple=powerpc-linux-gnu | FileCheck %s -check-prefix=ELF
|
||||
; RUN: llc < %s -mtriple=powerpc-apple-darwin9 | FileCheck %s -check-prefix=DARWIN
|
||||
; RUN: llc < %s -mtriple=powerpc-apple-darwin8 | FileCheck %s -check-prefix=DARWIN8
|
||||
|
||||
@a = global i1 true
|
||||
; no alignment
|
||||
@ -40,3 +41,6 @@
|
||||
@bar = common global [75 x i8] zeroinitializer, align 128
|
||||
;ELF: .comm bar,75,128
|
||||
;DARWIN: .comm _bar,75,7
|
||||
|
||||
;; Darwin8 doesn't support aligned comm. Just miscompile this.
|
||||
; DARWIN8: .comm _bar,75 ;
|
||||
|
Loading…
Reference in New Issue
Block a user