From d49e18d29f3c5622cfd373fbfa0b954d1c256455 Mon Sep 17 00:00:00 2001
From: Christopher Lamb
Date: Wed, 12 Dec 2007 08:44:39 +0000
Subject: [PATCH] Implement part of review feedback for address spaces.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44933 91177308-0d34-0410-b5e6-96231b3b80d8
---
docs/LangRef.html | 3 +-
include/llvm/Bitcode/LLVMBitCodes.h | 1 +
lib/AsmParser/llvmAsmParser.y | 40 +++++++---------------
lib/Bitcode/Writer/BitcodeWriter.cpp | 11 +++---
test/Assembler/2007-12-11-AddressSpaces.ll | 4 +--
5 files changed, 23 insertions(+), 36 deletions(-)
diff --git a/docs/LangRef.html b/docs/LangRef.html
index fd40c92f9aa..df6baa74632 100644
--- a/docs/LangRef.html
+++ b/docs/LangRef.html
@@ -671,7 +671,8 @@ accessed through pointers.
A global variable may be declared to reside in a target-specifc numbered
address space. For targets that support them, address spaces may affect how
optimizations are performed and/or what target instructions are used to access
-the variable. The default address space is zero.
+the variable. The default address space is zero. The address space qualifier
+must precede any other attributes.
LLVM allows an explicit section to be specified for globals. If the target
supports it, it will emit globals to the section specified.
diff --git a/include/llvm/Bitcode/LLVMBitCodes.h b/include/llvm/Bitcode/LLVMBitCodes.h
index 8d95c872a93..3b026efc9f6 100644
--- a/include/llvm/Bitcode/LLVMBitCodes.h
+++ b/include/llvm/Bitcode/LLVMBitCodes.h
@@ -194,6 +194,7 @@ namespace bitc {
FUNC_CODE_INST_FREE = 18, // FREE: [opty, op]
FUNC_CODE_INST_ALLOCA = 19, // ALLOCA: [instty, op, align]
FUNC_CODE_INST_LOAD = 20, // LOAD: [opty, op, align, vol]
+ // FIXME: Remove STORE in favor of STORE2 in LLVM 3.0
FUNC_CODE_INST_STORE = 21, // STORE: [valty,val,ptr, align, vol]
FUNC_CODE_INST_CALL = 22, // CALL: [attr, fnty, fnid, args...]
FUNC_CODE_INST_VAARG = 23, // VAARG: [valistty, valist, instty]
diff --git a/lib/AsmParser/llvmAsmParser.y b/lib/AsmParser/llvmAsmParser.y
index cd3a7edb502..c1f52a2eb03 100644
--- a/lib/AsmParser/llvmAsmParser.y
+++ b/lib/AsmParser/llvmAsmParser.y
@@ -1050,7 +1050,7 @@ Module *llvm::RunVMAsmParser(llvm::MemoryBuffer *MB) {
%type GlobalName OptGlobalAssign GlobalAssign
%type OptSection SectionString OptGC
-%type OptAlign OptCAlign
+%type OptAlign OptCAlign OptAddrSpace
%token ZEROINITIALIZER TRUETOK FALSETOK BEGINTOK ENDTOK
%token DECLARE DEFINE GLOBAL CONSTANT SECTION ALIAS VOLATILE THREAD_LOCAL
@@ -1137,6 +1137,9 @@ FPType : FLOAT | DOUBLE | PPC_FP128 | FP128 | X86_FP80;
LocalName : LOCALVAR | STRINGCONSTANT | PCTSTRINGCONSTANT ;
OptLocalName : LocalName | /*empty*/ { $$ = 0; };
+OptAddrSpace : ADDRSPACE '(' EUINT64VAL ')' { $$=$3; }
+ | /*empty*/ { $$=0; };
+
/// OptLocalAssign - Value producing statements have an optional assignment
/// component.
OptLocalAssign : LocalName '=' {
@@ -1316,17 +1319,10 @@ Types
$$ = new PATypeHolder($1);
CHECK_FOR_ERROR
}
- | Types '*' { // Pointer type?
+ | Types OptAddrSpace '*' { // Pointer type?
if (*$1 == Type::LabelTy)
GEN_ERROR("Cannot form a pointer to a basic block");
- $$ = new PATypeHolder(HandleUpRefs(PointerType::get(*$1)));
- delete $1;
- CHECK_FOR_ERROR
- }
- | Types ADDRSPACE '(' EUINT64VAL ')' '*' { // Pointer type?
- if (*$1 == Type::LabelTy)
- GEN_ERROR("Cannot form a pointer to a basic block");
- $$ = new PATypeHolder(HandleUpRefs(PointerType::get(*$1, $4)));
+ $$ = new PATypeHolder(HandleUpRefs(PointerType::get(*$1, $2)));
delete $1;
CHECK_FOR_ERROR
}
@@ -2073,41 +2069,31 @@ Definition
}
CHECK_FOR_ERROR
}
- | OptGlobalAssign GVVisibilityStyle ThreadLocal GlobalType ConstVal {
+ | OptGlobalAssign GVVisibilityStyle ThreadLocal GlobalType ConstVal
+ OptAddrSpace {
/* "Externally Visible" Linkage */
if ($5 == 0)
GEN_ERROR("Global value initializer is not a constant");
CurGV = ParseGlobalVariable($1, GlobalValue::ExternalLinkage,
- $2, $4, $5->getType(), $5, $3);
- CHECK_FOR_ERROR
- } GlobalVarAttributes {
- CurGV = 0;
- }
- | OptGlobalAssign GVVisibilityStyle ThreadLocal GlobalType ConstVal
- ADDRSPACE '(' EUINT64VAL ')' {
- /* "Externally Visible" Linkage with address space qualifier */
- if ($5 == 0)
- GEN_ERROR("Global value initializer is not a constant");
- CurGV = ParseGlobalVariable($1, GlobalValue::ExternalLinkage,
- $2, $4, $5->getType(), $5, $3, $8);
+ $2, $4, $5->getType(), $5, $3, $6);
CHECK_FOR_ERROR
} GlobalVarAttributes {
CurGV = 0;
}
| OptGlobalAssign GVInternalLinkage GVVisibilityStyle ThreadLocal GlobalType
- ConstVal {
+ ConstVal OptAddrSpace {
if ($6 == 0)
GEN_ERROR("Global value initializer is not a constant");
- CurGV = ParseGlobalVariable($1, $2, $3, $5, $6->getType(), $6, $4);
+ CurGV = ParseGlobalVariable($1, $2, $3, $5, $6->getType(), $6, $4, $7);
CHECK_FOR_ERROR
} GlobalVarAttributes {
CurGV = 0;
}
| OptGlobalAssign GVExternalLinkage GVVisibilityStyle ThreadLocal GlobalType
- Types {
+ Types OptAddrSpace {
if (!UpRefs.empty())
GEN_ERROR("Invalid upreference in type: " + (*$6)->getDescription());
- CurGV = ParseGlobalVariable($1, $2, $3, $5, *$6, 0, $4);
+ CurGV = ParseGlobalVariable($1, $2, $3, $5, *$6, 0, $4, $7);
CHECK_FOR_ERROR
delete $6;
} GlobalVarAttributes {
diff --git a/lib/Bitcode/Writer/BitcodeWriter.cpp b/lib/Bitcode/Writer/BitcodeWriter.cpp
index 3abac064683..abe19336d6f 100644
--- a/lib/Bitcode/Writer/BitcodeWriter.cpp
+++ b/lib/Bitcode/Writer/BitcodeWriter.cpp
@@ -141,6 +141,7 @@ static void WriteTypeTable(const ValueEnumerator &VE, BitstreamWriter &Stream) {
Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_POINTER));
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
Log2_32_Ceil(VE.getTypes().size()+1)));
+ Abbv->Add(BitCodeAbbrevOp(0)); // Addrspace = 0
unsigned PtrAbbrev = Stream.EmitAbbrev(Abbv);
// Abbrev for TYPE_CODE_FUNCTION.
@@ -198,16 +199,14 @@ static void WriteTypeTable(const ValueEnumerator &VE, BitstreamWriter &Stream) {
break;
case Type::PointerTyID: {
const PointerType *PTy = cast(T);
- // POINTER: [pointee type] or [pointee type, address space]
+ // POINTER: [pointee type, address space]
Code = bitc::TYPE_CODE_POINTER;
TypeVals.push_back(VE.getTypeID(PTy->getElementType()));
- if (unsigned AddressSpace = PTy->getAddressSpace())
- TypeVals.push_back(AddressSpace);
- else
- AbbrevToUse = PtrAbbrev;
+ unsigned AddressSpace = PTy->getAddressSpace();
+ TypeVals.push_back(AddressSpace);
+ if (AddressSpace == 0) AbbrevToUse = PtrAbbrev;
break;
}
-
case Type::FunctionTyID: {
const FunctionType *FT = cast(T);
// FUNCTION: [isvararg, attrid, retty, paramty x N]
diff --git a/test/Assembler/2007-12-11-AddressSpaces.ll b/test/Assembler/2007-12-11-AddressSpaces.ll
index 91f6d935ea2..e3cd2627870 100644
--- a/test/Assembler/2007-12-11-AddressSpaces.ll
+++ b/test/Assembler/2007-12-11-AddressSpaces.ll
@@ -5,9 +5,9 @@
; RUN: llvm-as < %s | llvm-dis |& grep {addrspace(22)} | count 5
%struct.mystruct = type { i32, i32 addrspace(33)*, i32, i32 addrspace(33)* }
-@input = global %struct.mystruct zeroinitializer addrspace(42) ; <%struct.mystruct addrspace(42)*> [#uses=1]
+@input = weak global %struct.mystruct zeroinitializer addrspace(42) ; <%struct.mystruct addrspace(42)*> [#uses=1]
@output = global %struct.mystruct zeroinitializer addrspace(66) ; <%struct.mystruct addrspace(66)*> [#uses=1]
-@y = global i32 addrspace(11)* addrspace(22)* null addrspace(33) ; [#uses=1]
+@y = external global i32 addrspace(11)* addrspace(22)* addrspace(33) ; [#uses=1]
define void @foo() {
entry: