Index: docs/LangRef.rst =================================================================== --- docs/LangRef.rst +++ docs/LangRef.rst @@ -1899,8 +1899,15 @@ must be a multiple of 8-bits. If omitted, the natural stack alignment defaults to "unspecified", which does not prevent any alignment promotions. +``P
`` + Specifies the address space that corresponds to program memory. + Harvard architectures can use this to specify what space LLVM + should place things such as functions or switch lookup tables + into. If omitted, the program memory space defaults to the + default address space of 0, which corresponds to a Von Neumann + architecture that has code and data in the same space. ``A
`` - Specifies the address space of objects created by '``alloca``'. + Specifies the address space of objects created by '``alloca``'. Defaults to the default address space of 0. ``p[n]:::`` This specifies the *size* of a pointer and its ```` and Index: include/llvm/IR/DataLayout.h =================================================================== --- include/llvm/IR/DataLayout.h +++ include/llvm/IR/DataLayout.h @@ -113,6 +113,7 @@ unsigned AllocaAddrSpace; unsigned StackNaturalAlign; + unsigned ProgramAddrSpace; enum ManglingModeT { MM_None, @@ -196,6 +197,7 @@ BigEndian = DL.isBigEndian(); AllocaAddrSpace = DL.AllocaAddrSpace; StackNaturalAlign = DL.StackNaturalAlign; + ProgramAddrSpace = DL.ProgramAddrSpace; ManglingMode = DL.ManglingMode; LegalIntWidths = DL.LegalIntWidths; Alignments = DL.Alignments; @@ -252,6 +254,8 @@ unsigned getStackAlignment() const { return StackNaturalAlign; } unsigned getAllocaAddrSpace() const { return AllocaAddrSpace; } + unsigned getProgramAddressSpace() const { return ProgramAddrSpace; } + bool hasMicrosoftFastStdCallMangling() const { return ManglingMode == MM_WinCOFFX86; } Index: include/llvm/IR/GlobalValue.h =================================================================== --- include/llvm/IR/GlobalValue.h +++ include/llvm/IR/GlobalValue.h @@ -182,6 +182,7 @@ GlobalValue(const GlobalValue &) = delete; unsigned getAlignment() const; + unsigned getAddressSpace() const; enum class UnnamedAddr { None, Index: lib/IR/DataLayout.cpp =================================================================== --- lib/IR/DataLayout.cpp +++ lib/IR/DataLayout.cpp @@ -181,6 +181,7 @@ BigEndian = false; AllocaAddrSpace = 0; StackNaturalAlign = 0; + ProgramAddrSpace = 0; ManglingMode = MM_None; NonIntegralAddressSpaces.clear(); @@ -221,6 +222,13 @@ return Bits / 8; } +static unsigned getAddrSpace(StringRef R) { + unsigned AddrSpace = getInt(R); + if (!isUInt<24>(AddrSpace)) + report_fatal_error("Invalid address space, must be a 24-bit integer"); + return AddrSpace; +} + void DataLayout::parseSpecifier(StringRef Desc) { StringRepresentation = Desc; while (!Desc.empty()) { @@ -358,10 +366,12 @@ StackNaturalAlign = inBytes(getInt(Tok)); break; } + case 'P': { // Function address space. + ProgramAddrSpace = getAddrSpace(Tok); + break; + } case 'A': { // Default stack/alloca address space. - AllocaAddrSpace = getInt(Tok); - if (!isUInt<24>(AllocaAddrSpace)) - report_fatal_error("Invalid address space, must be a 24bit integer"); + AllocaAddrSpace = getAddrSpace(Tok); break; } case 'm': Index: lib/IR/Globals.cpp =================================================================== --- lib/IR/Globals.cpp +++ lib/IR/Globals.cpp @@ -108,6 +108,11 @@ return cast(this)->getAlignment(); } +unsigned GlobalValue::getAddressSpace() const { + PointerType *PtrTy = getType(); + return PtrTy->getAddressSpace(); +} + void GlobalObject::setAlignment(unsigned Align) { assert((Align & (Align-1)) == 0 && "Alignment is not a power of 2!"); assert(Align <= MaximumAlignment && Index: test/Assembler/datalayout-program-addrspace.ll =================================================================== --- /dev/null +++ test/Assembler/datalayout-program-addrspace.ll @@ -0,0 +1,5 @@ +; RUN: llvm-as < %s | llvm-dis | FileCheck %s + +; CHECK: target datalayout = "P1" +target datalayout = "P1" + Index: test/Assembler/invalid-datalayout-alloca-addrspace.ll =================================================================== --- test/Assembler/invalid-datalayout-alloca-addrspace.ll +++ test/Assembler/invalid-datalayout-alloca-addrspace.ll @@ -1,4 +1,4 @@ ; RUN: not llvm-as < %s 2>&1 | FileCheck %s target datalayout = "A16777216" -; CHECK: Invalid address space, must be a 24bit integer +; CHECK: Invalid address space, must be a 24-bit integer Index: test/Assembler/invalid-datalayout-program-addrspace.ll =================================================================== --- test/Assembler/invalid-datalayout-program-addrspace.ll +++ test/Assembler/invalid-datalayout-program-addrspace.ll @@ -1,4 +1,4 @@ ; RUN: not llvm-as < %s 2>&1 | FileCheck %s +; CHECK: Invalid address space, must be a 24-bit integer target datalayout = "A16777216" -; CHECK: Invalid address space, must be a 24bit integer