| //===- ir_test.go - Tests for ir ------------------------------------------===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file tests bindings for the ir component. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| package llvm |
| |
| import ( |
| "strings" |
| "testing" |
| ) |
| |
| func testAttribute(t *testing.T, attr Attribute, name string) { |
| mod := NewModule("") |
| defer mod.Dispose() |
| |
| ftyp := FunctionType(VoidType(), nil, false) |
| fn := AddFunction(mod, "foo", ftyp) |
| |
| fn.AddFunctionAttr(attr) |
| newattr := fn.FunctionAttr() |
| if attr != newattr { |
| t.Errorf("got attribute mask %d, want %d", newattr, attr) |
| } |
| |
| text := mod.String() |
| if !strings.Contains(text, " "+name+" ") { |
| t.Errorf("expected attribute '%s', got:\n%s", name, text) |
| } |
| |
| fn.RemoveFunctionAttr(attr) |
| newattr = fn.FunctionAttr() |
| if newattr != 0 { |
| t.Errorf("got attribute mask %d, want 0", newattr) |
| } |
| } |
| |
| func TestAttributes(t *testing.T) { |
| // Tests that our attribute constants haven't drifted from LLVM's. |
| attrTests := []struct { |
| attr Attribute |
| name string |
| }{ |
| {SanitizeAddressAttribute, "sanitize_address"}, |
| {AlwaysInlineAttribute, "alwaysinline"}, |
| {BuiltinAttribute, "builtin"}, |
| {ByValAttribute, "byval"}, |
| {ConvergentAttribute, "convergent"}, |
| {InAllocaAttribute, "inalloca"}, |
| {InlineHintAttribute, "inlinehint"}, |
| {InRegAttribute, "inreg"}, |
| {JumpTableAttribute, "jumptable"}, |
| {MinSizeAttribute, "minsize"}, |
| {NakedAttribute, "naked"}, |
| {NestAttribute, "nest"}, |
| {NoAliasAttribute, "noalias"}, |
| {NoBuiltinAttribute, "nobuiltin"}, |
| {NoCaptureAttribute, "nocapture"}, |
| {NoDuplicateAttribute, "noduplicate"}, |
| {NoImplicitFloatAttribute, "noimplicitfloat"}, |
| {NoInlineAttribute, "noinline"}, |
| {NonLazyBindAttribute, "nonlazybind"}, |
| {NonNullAttribute, "nonnull"}, |
| {NoRedZoneAttribute, "noredzone"}, |
| {NoReturnAttribute, "noreturn"}, |
| {NoUnwindAttribute, "nounwind"}, |
| {OptimizeNoneAttribute, "optnone"}, |
| {OptimizeForSizeAttribute, "optsize"}, |
| {ReadNoneAttribute, "readnone"}, |
| {ReadOnlyAttribute, "readonly"}, |
| {ReturnedAttribute, "returned"}, |
| {ReturnsTwiceAttribute, "returns_twice"}, |
| {SExtAttribute, "signext"}, |
| {SafeStackAttribute, "safestack"}, |
| {StackProtectAttribute, "ssp"}, |
| {StackProtectReqAttribute, "sspreq"}, |
| {StackProtectStrongAttribute, "sspstrong"}, |
| {StructRetAttribute, "sret"}, |
| {SanitizeThreadAttribute, "sanitize_thread"}, |
| {SanitizeMemoryAttribute, "sanitize_memory"}, |
| {UWTableAttribute, "uwtable"}, |
| {ZExtAttribute, "zeroext"}, |
| {ColdAttribute, "cold"}, |
| } |
| |
| for _, a := range attrTests { |
| testAttribute(t, a.attr, a.name) |
| } |
| } |